Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120

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

23.04.2017, 10:04. Показов 3758. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru