3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120

Порядок вызова конструкторов

23.04.2017, 10:04. Показов 3949. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня.
Наткнулся в коде на интересные грабли:
test.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "test.h"
 
Test test;
 
Test::Test()
{
    count = 0;
}
 
MyClass::MyClass()
{
    test.count++;
}
test.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Test
{
    byte count;
    Test();
};
 
class MyClass
{
    MyClass();
}
 
extern Test test;
main.cpp
C++
1
2
3
4
5
6
7
8
#include "test.h"
 
MyClass cl1, cl2;
 
int main()
{
    while(true);
}
После создания cl1 и cl2 test.count == 0;
В коде я вижу, что сначала отрабатывают конструкторы классов, а потом конструктор структуры. Почему так происходит?
Разве не должны выполняться конструкторы используемых объектов, а потом тех, что используют их.
Можно ли указать приоритет выполнения конструкторов вручную?

Пишу на System Workbench for STM32 (сборка eclipse)

Заранее спасибо за помощь
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2017, 10:04
Ответы с готовыми решениями:

Порядок вызова конструкторов
Есть классы First и Second. Класс Second наследуется от First. Я имею ввиду: class Second: public First { //... };

Порядок вызова конструкторов
на срр-reference нашёл тему про виртуальный деструктор, но я так и не понял (да там и не объясняется), почему именно конструктор класса...

Порядок вызова конструкторов/деструкторов
Вопрос чисто теоретический. Попробую сформулировать, не ругайте если получится коряво. Например, есть некий класс для писанины в лог,...

27
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
08.02.2018, 12:25  [ТС]
Студворк — интернет-сервис помощи студентам
Я тоже не люблю зависимость порядка инициализации.
Вообще стиль программирования железа начинается с main и в ней уже идет весь процесс настроек. Там порядок четкий. Но мне предстоит закрывать библиотеку и я хочу оставить main для конечного пользователя чистым без всяких принудительных вызовов init();
Ссылку на проект скинул в личку.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
08.02.2018, 23:10
Лучший ответ Сообщение было отмечено beam как решение

Решение

beam, значит так, посмотрел внимательно проект.
Во-первых, следует включить режим сборки Release. Тогда в бинарник не будет добавляться отладочная информация, которая сильно раздувает код + включится необходимая оптимизация.
Если отладочная информация необходима, естественно нужно будет ее использовать, но при этом нельзя ориентироваться на размер, который получается с ней. В режиме компиляции Release разница между кодом с использованием локальной статической переменной и без составляет примерно 3.5кб.

Во-вторых и в главных, стало понятно почему раздувает код при использовании локальной статической переменной.
В С++11 и старше (а именно эта версия действует по умолчанию сейчас) для локальных статических переменных используется механизм гарантирующий отсутствие гонок при инициализации (теоретически и с учетом прерываний МК). Этот механизм не бесплатен. Учитывая возможность того, что оптимизацией этого механизма под конкретную платформу еще никто серьезно не занимался, а также то, что ТС скорее всего даже и не подозревает об этой фиче, я предлагаю ее отключить. Делается это флагом -fno-threadsafe-statics. После чего раздувание кода больше не наблюдается.
1
09.02.2018, 08:49

Не по теме:

Цитата Сообщение от beam Посмотреть сообщение
C++
1
2
3
public: 
uint z; 
TestClass(){};
Для синглтона имеет смысл закрыть конструктор в private
A guf либо - статический паблик, либо свободный френд, иначе не будет доступа (конструкторы закрыты)

0
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
09.02.2018, 09:24  [ТС]
У меня при попытке компиляции на релиз отваливаются хидеры. Хз почему, но разбираться я в этом не стал.
Отладочная информация ведь не идет в сам бинарник - это же непосредственно команды ядру. По оптимизации - возможно так и есть. Буду рыть почему отваливается.

С++11 я сам включил, т.к. мне нравится его функционал.
С потоками все ясно. FreeRTOS только далеко в планах.
Про оптимизацию - это да. Я пока не настолько силен, чтобы оптимизировать за рамками синтаксиса.

Да, действительно с флагом -fno-threadsafe-statics код уменьшился до обычных размеров.

new в свою очередь продолжает отжирать свои 50кб. Возможно он тоже использует какие-то свои фичи.

В процессе разработки все больше и больше узнаю разных вещей. Все таки большинство родилось на десктоп системах, которые уже далеко убежали вперед в отличие от embedded систем. Век живи, век учись как говорится...

Большое спасибо за помощь!

Добавлено через 1 минуту
IGPIGP, для синглтона все понятно, я его указал просто как пример обращения.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
09.02.2018, 09:46
Цитата Сообщение от beam Посмотреть сообщение
У меня при попытке компиляции на релиз отваливаются хидеры. Хз почему, но разбираться я в этом не стал.
Отладочная информация ведь не идет в сам бинарник - это же непосредственно команды ядру. По оптимизации - возможно так и есть. Буду рыть почему отваливается.
Там в свойствах проект просто нужно добавить каталог для поиска заголовочных файлов.
Отладочная инфа идет в бинарник и не надо, пожалуйста, с этим спорить. Без отладочной информации бинарник занимает всего 20кб.
1
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
12.02.2018, 15:59  [ТС]
Очень интересно. Никогда не думал, что в бинарнике есть что-то кроме исполняемых команд. Единственное исключение - знаю, что например j-link debugger умеет "программно" делать много брейк поинтов, но это спец решение.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
12.02.2018, 16:12
Цитата Сообщение от beam Посмотреть сообщение
Никогда не думал, что в бинарнике есть что-то кроме исполняемых команд.
Там может быть что угодно. Хоть картинки можно зашить, хоть видео, хоть ...

Пример: Поместить в исходник большую строку из файла

Вы же видели exe'шники по несколько гигабайт? Это же не команды.
0
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
12.02.2018, 16:33  [ТС]
ненене, так-то да - это всего лишь объем данных. Там может хоть что быть и 1 рабочая команда loop на себя. Но я имею ввиду не рабочую инфу (исходные данные (не команды), будь то картинки, строки, массивы данных для расчета crc и подобное..), а какую-либо отладочную, не участвующую непосредственно в работе программы.

Добавлено через 2 минуты
То есть я всегда думал, что, по крайней мере в контроллерах, отладка производится силами IDE и непосредственно исходного кода. И в памяти мк находится только то, что требуется ему для работы в автономном режиме и ни байта больше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2018, 16:33

Классы, наследование, порядок вызова конструкторов
допустим у меня эсть два класса class a { publc: char *n; a() { n= new char ; } ~a()

Порядок вызова конструкторов при множественном наследовании
Здравствуйте, меня интересует вопрос, как изменить последовательность вызова конструкторов базовых классов во время создания объекта класса...

Порядок вызова конструкторов при присваивании объектов одного класса
Имеется код ниже. Wein dres = rom; Где dres и rom объекты класса Wein. Класс Wein имеет все конструкторы по умолчанию....

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include <iostream> struct foo { foo(int){std::cout << "int ctor" << std::endl;} foo()...

Очерёдность вызова конструкторов класса
У меня есть 2 класса, к примеру Base и Mod. Mod является наследником Base. Классу Mod соответствует такой конструктор: Mod(int _id, int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru