383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
1 | ||||||
Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции10.08.2014, 00:10. Показов 2800. Ответов 38
Метки нет (Все метки)
Безопасно ли такое использование:
Не по теме: Знаю вопрос тупой, но я запутался что-то :cry: Забыл главное: будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции?
0
|
10.08.2014, 00:10 | |
Ответы с готовыми решениями:
38
Подождать пока все контролы на форме не будут инициализированы Как создавать файлы, которые будут подгружаться по мере обращения к ним? Какие шрифты гарантированно будут у пользователя(CSS:font-family) Как будут инициализированы переменные в теле функции и вне тела функции? |
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
10.08.2014, 02:02 | 21 |
В 2.95.х были еще более жирные аспекты.
Добавлено через 6 минут Да уж. Ну значит я за 12 лет не встретил примеров нестандартного кода на gcc 2 и 3, которые бы его потребовали. А GCC 2 огромное количество нестандартного кода пропускает. Приходилось портировать программы написанные на 2.95 на более новые версии, ни с чем не сравнимые ощущения. Из серии "как это вообще могло работать". Добавлено через 10 минут Вот например, из того, что вспомнил про 2.95. Можно было определять параметры по-умолчанию у функций и в определении и в объявлении. Если у шаблонного класса был добавлен этот же шаблон в друзья (чтобы разные инстанции были друг другу друзьями), то этот код при инстанцировании выдавал internal compiler error. Вообще на ICE там частенько приходилось смотреть. Вот так.
0
|
Каратель
|
|
10.08.2014, 14:17 | 22 |
сколько демагогии, вместо придерживания простых правил: целочисленные константы значения которых известны на момент компиляции оформляем в enum, все прочее в функцию возвращающую const T& на static переменную определенную внутри функции
Добавлено через 1 минуту скажи это тому кто будет работать с этим кодом через
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
10.08.2014, 19:48 | 23 |
Хочется заметить что демагогия, в основном, не касалась первоначальной темы.
Предложенные тобой простые правила тоже не панацея. От перекрестных ссылок, если кто-то захочет, это не спасет: сохранит он себе не копию, а ссылку в другом глобальном объекте, а потом статический объект-владелец уничтожится и получим висячую ссылку. У enum тоже есть свои недостатки (в С++03) - это фиксированный тип значений. А вот мы совсем недавно налетали на такое: один и тот же enum с разными значениями в разных файлах. В одном куске программы одно поведение, в другом - совсем иное, на стыке - хаос и анархия. Это я к тому, что правила хоть и хорошие (я с ними почти согласен), но субъективные. И ежели кто захочет нагадить, то у него получится, будь уверен. Или я что-то пропустил, или в данной теме не было вопросов о сопровождаемости кода. Был исключительно технический вопрос. Я подразумеваю, что у автора своя голова на плечах и он знает что делает. Переубеждать всех, кто по моему мнению собирается делать что-то некорректное или опасное (в любых смыслах) я лично не собираюсь, и вряд ли хватит сил это делать, если соберусь. Так что тебе тоже не советую. В общем, если какие вопросы по поводу правильности такого подхода, то это к автору, а не ко мне.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
10.08.2014, 22:00 [ТС] | 24 |
я как раз хотел избежать этого:
я понимаю, что это не до конца singleton, но я хотел избежать этой дополнительной писанины с локальными статическими константами, обертыванием их в функцию и т.д.
0
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|||||||||||
11.08.2014, 21:56 | 25 | ||||||||||
Да. Все константы и глобальные переменные инициализируются до вызова main(). Причем статическая инициализация (точнее - даже загрузка)
Последовательность динамической инициализации глобальных переменных, насколько я помню, не определина. Если у вас есть глобальнае obj1 и obj2, то при инициализации одного использовать другой не стоит. Или я не понял, и вы имели в виду что-то другое?
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
11.08.2014, 23:06 [ТС] | 26 |
Выходит последовательность статической инициализации глобальных переменных также не определена, только она гарантированно происходит до динамической инициализации глобальных объектов?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
11.08.2014, 23:37 | 27 |
А зачем тебе нужна это последовательность? Она ничего не дает.
А вот динамическая инициализация вполне определена:
2
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
11.08.2014, 23:42 | 28 |
Я не эксперт в стандартах, но писать в глобальной секции одного си модуля
int a= 5; а в глобальной секции другого int b= a; я бы не решился. Хотя, возможно, b в этом случае будет инициализирована динамически, или даже умный компаноновщик сможет отследить порядок статической инициализации и все будет OK.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
11.08.2014, 23:44 | 29 |
То, что в разных модулях порядок инициализации не определен было сказано еще в начале темы. Он, как я понял, спрашивает про один модуль.
0
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
11.08.2014, 23:46 | 30 |
PS. В рамках одного модуля, конечно, инициализация упорядочена.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
12.08.2014, 00:10 | 31 |
Кстати не возможно, а точно так.
3.6.2/2 Добавлено через 6 минут Это плохо еще и тем, что в один прекрасный момент кто-нибудь заменит 5 на вызов функции и получим UB.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
12.08.2014, 01:12 [ТС] | 32 |
DrOffset, gng, что-то краски все сгущаются и сгущаются
Правильно ли я понял: Статическая инициализация - это когда объект инициализируется на этапе компиляции. Сюда можно отнести встроенные типы, POD типы, и классы с constexpr конструкторами. Динамическая инициализация - это когда объект инициализируется и обретает константность во время выполнения. Сюда относим все нетривиальные классы. Вот эта фраза: То есть, нетривиальный объект obj можно инициализировать, используя ival, независимо в каких модулях трансляции они находятся?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
12.08.2014, 01:33 | 33 |
Константные выражения или constexpr. POD или не POD напрямую не имеет значения.
Константность самого объекта, опять же, необязательна. Можно. Это вытекает из того, что вся статическая инициализация прошита в бинарник и когда модуль загружается в оперативку еще до передачи управления в точку входа у нас уже есть все валидные данные и адреса для таких объектов. Добавлено через 8 минут Завязываться правда на такое опасно. Мало ли кто поменяет инициализацию со статической на динамическую и получим UB.
1
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
12.08.2014, 01:45 [ТС] | 34 |
Насчет константности сглупил, ведь тема создавалась для выяснения вопросов с константами, а теперь разраслась.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
12.08.2014, 01:47 | 35 |
Да я сам на это же налетел на второй странице.
Со всеми бывает, ничего страшного.
0
|
Заблокирован
|
|
12.08.2014, 16:06 | 36 |
вы и понятия не имеете, что есть что.
Глобальные объекты могут иметь внешнюю компоновку и всегда инициализированы, в то время как все статические, - только внутреннюю, именно поэтому сделай глобальный объект статическим и он гарантированно будет иметь внутреннюю компоновку. Удачи в незнании.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
12.08.2014, 16:30 [ТС] | 37 |
Прям таки всегда инициализированы?
И что мне делать с этой внутренней компоновкой? Мне надо чтобы константные объекты были доступны по всей программе. И не имеет смысла для этого делать локальный статический объект внутри функции, чтобы гарантированно получить его инициализированным.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
12.08.2014, 20:23 | 38 |
Тут речь идет не про статические объекты с ключом static. А про статическое размещение, оно же static storage duration. А про компоновку тут вообще речи не шло, изначально. Вопрос был совсем о другом.
0
|
Заблокирован
|
|
12.08.2014, 20:59 | 39 |
0
|
12.08.2014, 20:59 | |
12.08.2014, 20:59 | |
Помогаю со студенческими работами здесь
39
формы и обращения к ним Код создания N-го колва checkBox'ов и обращения к ним Глобальные объекты в разных единицах трансляции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |