3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
|
||||||||||||||||
1 | ||||||||||||||||
Порядок вызова конструкторов23.04.2017, 10:04. Показов 2984. Ответов 27
Метки нет (Все метки)
Всем доброго дня.
Наткнулся в коде на интересные грабли: test.cpp
В коде я вижу, что сначала отрабатывают конструкторы классов, а потом конструктор структуры. Почему так происходит? Разве не должны выполняться конструкторы используемых объектов, а потом тех, что используют их. Можно ли указать приоритет выполнения конструкторов вручную? Пишу на System Workbench for STM32 (сборка eclipse) Заранее спасибо за помощь
0
|
23.04.2017, 10:04 | |
Ответы с готовыми решениями:
27
Порядок вызова конструкторов Порядок вызова конструкторов Порядок вызова конструкторов/деструкторов Классы, наследование, порядок вызова конструкторов |
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
|
|
08.02.2018, 12:25 [ТС] | 21 |
Я тоже не люблю зависимость порядка инициализации.
Вообще стиль программирования железа начинается с main и в ней уже идет весь процесс настроек. Там порядок четкий. Но мне предстоит закрывать библиотеку и я хочу оставить main для конечного пользователя чистым без всяких принудительных вызовов init(); Ссылку на проект скинул в личку.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
08.02.2018, 23:10 | 22 |
Сообщение было отмечено beam как решение
Решение
beam, значит так, посмотрел внимательно проект.
Во-первых, следует включить режим сборки Release. Тогда в бинарник не будет добавляться отладочная информация, которая сильно раздувает код + включится необходимая оптимизация. Если отладочная информация необходима, естественно нужно будет ее использовать, но при этом нельзя ориентироваться на размер, который получается с ней. В режиме компиляции Release разница между кодом с использованием локальной статической переменной и без составляет примерно 3.5кб. Во-вторых и в главных, стало понятно почему раздувает код при использовании локальной статической переменной. В С++11 и старше (а именно эта версия действует по умолчанию сейчас) для локальных статических переменных используется механизм гарантирующий отсутствие гонок при инициализации (теоретически и с учетом прерываний МК). Этот механизм не бесплатен. Учитывая возможность того, что оптимизацией этого механизма под конкретную платформу еще никто серьезно не занимался, а также то, что ТС скорее всего даже и не подозревает об этой фиче, я предлагаю ее отключить. Делается это флагом -fno-threadsafe-statics . После чего раздувание кода больше не наблюдается.
1
|
IGPIGP
|
09.02.2018, 08:49
#23
|
0
|
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
|
|
09.02.2018, 09:24 [ТС] | 24 |
У меня при попытке компиляции на релиз отваливаются хидеры. Хз почему, но разбираться я в этом не стал.
Отладочная информация ведь не идет в сам бинарник - это же непосредственно команды ядру. По оптимизации - возможно так и есть. Буду рыть почему отваливается. С++11 я сам включил, т.к. мне нравится его функционал. С потоками все ясно. FreeRTOS только далеко в планах. Про оптимизацию - это да. Я пока не настолько силен, чтобы оптимизировать за рамками синтаксиса. Да, действительно с флагом -fno-threadsafe-statics код уменьшился до обычных размеров. new в свою очередь продолжает отжирать свои 50кб. Возможно он тоже использует какие-то свои фичи. В процессе разработки все больше и больше узнаю разных вещей. Все таки большинство родилось на десктоп системах, которые уже далеко убежали вперед в отличие от embedded систем. Век живи, век учись как говорится... Большое спасибо за помощь! Добавлено через 1 минуту IGPIGP, для синглтона все понятно, я его указал просто как пример обращения.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
09.02.2018, 09:46 | 25 |
Там в свойствах проект просто нужно добавить каталог для поиска заголовочных файлов.
Отладочная инфа идет в бинарник и не надо, пожалуйста, с этим спорить. Без отладочной информации бинарник занимает всего 20кб.
1
|
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
|
|
12.02.2018, 15:59 [ТС] | 26 |
Очень интересно. Никогда не думал, что в бинарнике есть что-то кроме исполняемых команд. Единственное исключение - знаю, что например j-link debugger умеет "программно" делать много брейк поинтов, но это спец решение.
0
|
Неэпический
|
|
12.02.2018, 16:12 | 27 |
Там может быть что угодно. Хоть картинки можно зашить, хоть видео, хоть ...
Пример: Поместить в исходник большую строку из файла Вы же видели exe'шники по несколько гигабайт? Это же не команды.
0
|
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
|
|
12.02.2018, 16:33 [ТС] | 28 |
ненене, так-то да - это всего лишь объем данных. Там может хоть что быть и 1 рабочая команда loop на себя. Но я имею ввиду не рабочую инфу (исходные данные (не команды), будь то картинки, строки, массивы данных для расчета crc и подобное..), а какую-либо отладочную, не участвующую непосредственно в работе программы.
Добавлено через 2 минуты То есть я всегда думал, что, по крайней мере в контроллерах, отладка производится силами IDE и непосредственно исходного кода. И в памяти мк находится только то, что требуется ему для работы в автономном режиме и ни байта больше.
0
|
12.02.2018, 16:33 | |
12.02.2018, 16:33 | |
Помогаю со студенческими работами здесь
28
Порядок вызова конструкторов при множественном наследовании Порядок вызова конструкторов при присваивании объектов одного класса Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки Очерёдность вызова конструкторов класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |