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

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

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

Author24 — интернет-сервис помощи студентам
Всем доброго дня.
Наткнулся в коде на интересные грабли:
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2017, 10:04
Ответы с готовыми решениями:

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

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

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

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

27
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
08.02.2018, 12:25  [ТС] 21
Author24 — интернет-сервис помощи студентам
Я тоже не люблю зависимость порядка инициализации.
Вообще стиль программирования железа начинается с 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

Не по теме:

Цитата Сообщение от 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  [ТС] 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
Цитата Сообщение от beam Посмотреть сообщение
У меня при попытке компиляции на релиз отваливаются хидеры. Хз почему, но разбираться я в этом не стал.
Отладочная информация ведь не идет в сам бинарник - это же непосредственно команды ядру. По оптимизации - возможно так и есть. Буду рыть почему отваливается.
Там в свойствах проект просто нужно добавить каталог для поиска заголовочных файлов.
Отладочная инфа идет в бинарник и не надо, пожалуйста, с этим спорить. Без отладочной информации бинарник занимает всего 20кб.
1
3 / 4 / 4
Регистрация: 22.05.2015
Сообщений: 120
12.02.2018, 15:59  [ТС] 26
Очень интересно. Никогда не думал, что в бинарнике есть что-то кроме исполняемых команд. Единственное исключение - знаю, что например j-link debugger умеет "программно" делать много брейк поинтов, но это спец решение.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
12.02.2018, 16:12 27
Цитата Сообщение от beam Посмотреть сообщение
Никогда не думал, что в бинарнике есть что-то кроме исполняемых команд.
Там может быть что угодно. Хоть картинки можно зашить, хоть видео, хоть ...

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

Вы же видели 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2018, 16:33
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru