реклама на сайте
подробности

 
 
> __no_init и конструктор в С++
jorikdima
сообщение Jan 19 2011, 21:00
Сообщение #1


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Приветствую.
Есть некий класс, который содержит в качестве полей большие массивы. Кроме того, есть и другие поля, которые надо инициализировать и есть рукописный конструктор, который готов провести эту инициализацию. Так как массивы инитить необязательно, то есть большое желание сократить код прошивки путем отказа от дефолтовой инициализации этих больших буферов (прошивка сокращается на объем равный размеру буферов, так как инициализирующий массив, который переписывается в РАМ в стартапе попросту отсутствует). Я обнадежился, надеясь добавить __no_init в описание поля класса, но конечно не прокатило, так как эта директива касается только объектов целиком. Тогда я объявил весь объект (глобальный) моего класса __no_init, а инициализацию нужных мне полей добавил явно в коструктор, прошивка сократилась, но конструктор не вызывается. Почему отсутствие инициализации всех полей класса приводит и к отказу вызывать конструктор (просто функция по сути)? Можно как-то выкрутиться из ситуации? А то очень уж хочется ничего не делая сократить прошивку на четверть.
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jorikdima
сообщение Jan 21 2011, 21:07
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Век живи, век учись sm.gif
А дело было так:
Я пишу на С++ и нередко пользуюсь виртуальными функциями, в данном проекте так же. Как устроена работа с виртуальными функциями можно прочитать тут. Так вот, как выясняется (в доке на компайлер про это ни слова) __no_init, судя по всему, для объектов пользовательских классов исключает вызов конструктора. То есть для массивов или других глобальных объектов обычных типов он просто не помещает их в секцию инициализируемых данных, а для пользовательских классов не вызывает конструктор. Это догадка, как я сказал в доке ни слова.
Классы, объекты которого я сделал __no_init , содержат виртуальные методы. Конструктор для этих объектов не вызывается! А это значит, что таблица виртуальных методов не заполняется и адреса моих виртуальных функций туда не попадают. Далее линкер видит, что переопределенные мои виртуальные функции никем не используются (конструктора то нету, помещающие их адреса в таблицу) и благополучно их выкидывает! Вот и минус 1к кода (код функций). Я был сбит с пути тем, что объем высвобождаемой памяти примерно равен размеру буферов в объектах, которые я пометил __no_init - это просто совпадение.
Всем спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 16:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016