jcxz 242 25 августа Опубликовано 25 августа · Жалоба 20 минут назад, const сказал: Если я не ошибаюсь, в С++ глобальные переменные по умолчанию static, если не указано иного (extern напр.), может в этом дело. Сильно сомневаюсь в этом. Для теста только что создал в C++-проекте глобальную переменную qqq (нигде не используемую). Просто написал в main(): int qqq; После компиляции вижу имя "qqq" в результирующем .obj-файле. Далее - для теста добавляю перед int слово static: static int qqq; более ничего не меняя. Результат - имя "qqq" пропало из результирующего .obj. Вывод: Значит в первом случае "qqq" - глобальна (так как явно её имя имеется в таблице экспорта .obj-файла); а во втором - локальна. PS: IAR ARM 7.80.4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 25 августа Опубликовано 25 августа · Жалоба 3 minutes ago, jcxz said: Может такое быть? Да, может. может, а lto может увидеть, что никто больше ничего в переменную glb из секции zero bss не пишет, ни в одной единице трансляции, и посчитать что там всегда 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 25 августа Опубликовано 25 августа · Жалоба 2 минуты назад, _pv сказал: может, а lto может увидеть, что никто больше ничего в переменную glb из секции zero bss не пишет, ни в одной единице трансляции, и посчитать что там всегда 0. Ну и пускай видит. Я же писал о том, что для корректного теста результата IAR другим компилятором, следует выключить LTO. Так как неизвестно - была ли включена LTO при компиляции примеров ТС из первого поста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 25 августа Опубликовано 25 августа · Жалоба 4 minutes ago, jcxz said: Ну и пускай видит. Я же писал о том, что для корректного теста результата IAR другим компилятором, следует выключить LTO. Так как неизвестно - была ли включена LTO при компиляции примеров ТС из первого поста. а как это включаеся в ИАР. Понятия не имею, что такое LTO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 25 августа Опубликовано 25 августа · Жалоба 15 минут назад, jcxz сказал: Сильно сомневаюсь в этом. Для теста только что создал в C++-проекте глобальную переменную qqq (нигде не используемую). Просто написал в main(): int qqq; После компиляции вижу имя "qqq" в результирующем .obj-файле. Далее - для теста добавляю перед int слово static: static int qqq; более ничего не меняя. Результат - имя "qqq" пропало из результирующего .obj. Вывод: Значит в первом случае "qqq" - глобальна (так как явно её имя имеется в таблице экспорта .obj-файла); а во втором - локальна. PS: IAR ARM 7.80.4 ТС перепутал с const. Те да - по-умолчанию статические. 5 минут назад, const сказал: а как это включаеся в ИАР. Понятия не имею, что такое LTO. У вас это вроде, называется, multi-file compilation. Но не знаю, запускается ли там полноценная LTO, и вообще есть ли она в IAR, т.к. это "фишка" GCC/CLang, т.к. они транслируют код сначала в IR (внутреннее представление), а уже потом его в общую сборную солянку bitimage, а уже потом в объектник, а уже потом в файл исполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 25 августа Опубликовано 25 августа · Жалоба 3 minutes ago, Arlleex said: ТС перепутал с const. Те да - по-умолчанию статические. У вас это вроде, называется, multi-file compilation. Но не знаю, запускается ли там полноценная LTO, и вообще есть ли она в IAR. все что есть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 25 августа Опубликовано 25 августа · Жалоба 3 минуты назад, const сказал: все что есть У меня IAR-а нету, но вот скрин из интернетов Видимо, у Вас какая-то старая совсем версия или что-то подобное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 25 августа Опубликовано 25 августа · Жалоба @Arlleex Есть такое, не обратил внимания. С "Multi-file Compilation" компилируется. Листинг тот же. Ничего не выкидывает даже когда забираю обращения к портам. При дополнительном выборе "Discard Unused Publics" - не компилируется вообще - ошибка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 25 августа Опубликовано 25 августа · Жалоба Да перейдите на другую версию компилятора. На предыдущей странице вы уже убедительное доказательство косяка IAR привели, когда к регистрам volatile полезли🙂 13 минут назад, const сказал: С "Multi-file Compilation" компилируется. Листинг тот же. Ничего не выкидывает даже когда забираю обращения к портам. Значит в данном случае у IAR не такая агрессивная оптимизация. Что ж, бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться