|
__no_init и конструктор в С++ |
|
|
|
Jan 19 2011, 21:00
|

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

|
Приветствую. Есть некий класс, который содержит в качестве полей большие массивы. Кроме того, есть и другие поля, которые надо инициализировать и есть рукописный конструктор, который готов провести эту инициализацию. Так как массивы инитить необязательно, то есть большое желание сократить код прошивки путем отказа от дефолтовой инициализации этих больших буферов (прошивка сокращается на объем равный размеру буферов, так как инициализирующий массив, который переписывается в РАМ в стартапе попросту отсутствует). Я обнадежился, надеясь добавить __no_init в описание поля класса, но конечно не прокатило, так как эта директива касается только объектов целиком. Тогда я объявил весь объект (глобальный) моего класса __no_init, а инициализацию нужных мне полей добавил явно в коструктор, прошивка сократилась, но конструктор не вызывается. Почему отсутствие инициализации всех полей класса приводит и к отказу вызывать конструктор (просто функция по сути)? Можно как-то выкрутиться из ситуации? А то очень уж хочется ничего не делая сократить прошивку на четверть. Спасибо.
|
|
|
|
|
 |
Ответов
|
Jan 20 2011, 06:51
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(jorikdima @ Jan 20 2011, 03:00)  Приветствую. Есть некий класс, который содержит в качестве полей большие массивы. Кроме того, есть и другие поля, которые надо инициализировать и есть рукописный конструктор, который готов провести эту инициализацию. Так как массивы инитить необязательно, то есть большое желание сократить код прошивки путем отказа от дефолтовой инициализации этих больших буферов (прошивка сокращается на объем равный размеру буферов, так как инициализирующий массив, который переписывается в РАМ в стартапе попросту отсутствует). Что-то я не понял, откуда оверхед. Если есть конструктор, то в нем программист явно указывает, что из представления класса инициализировать и как. Если инициализация массивов не нужна, так и не описывать ее, этот член просто не будет проинициализирован. Насколько я ничего не помню, как-то так.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 20 2011, 08:09
|

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

|
Цитата(dxp @ Jan 20 2011, 09:51)  Что-то я не понял, откуда оверхед. Если есть конструктор, то в нем программист явно указывает, что из представления класса инициализировать и как. Если инициализация массивов не нужна, так и не описывать ее, этот член просто не будет проинициализирован. Насколько я ничего не помню, как-то так. Чего-то я до конца не понимаю. Для начала несколько цитат из Страуструппа: 1. Глава 10.2.3 Конструкторы Цитата Если класс имеет конструктор, все объекты этого класса будут проинициализированны. 2. Глава 10.4.2 Конструкторы по умолчанию Цитата Конструктор по умолчанию, сгенерированный компилятором, неявно вызывает конструкторы по умолчанию для членов класса и конструкторы базовых классов. Например: Код struct { int i; int vi[10]; Table t1; Table vt[10]; }; Tables tt; В этом примере переменная tt будет проинициализированна сгенерированным конструктором по умолчанию, который вызовет Table(15) (прим. Для класса Table определен конструктор с дефолтовым аргументом 15) для tt.t1 и каждого элемента tt.vt. С другой стороны, tt.i и элементы tt.vi не проинициализированны, потому что их тип не является классом. Причина различной обработки классов и встроенных типов заключается в требовании совместимости с С и в боязни вызвать дополнительные затраты времени на этапе выполнения. Что на деле. Я запустил MS Visual Studio и нарисовал там простой код: Код class JJ { private: int y; int e[3];
public: JJ() {
} };
JJ j1; void main() { JJ j2; while(1); } Создается два объекта, один на стеке, один глобальный. Определен пустой конструктор по умолчанию, хотя это не играет никакой роли! В результате объект j1 полностью инитится нулями, а j2 не инитится. Почему для j2 игнорируется цитата 1, а для j1 цитата два?
|
|
|
|
|
Jan 20 2011, 08:25
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(jorikdima @ Jan 20 2011, 14:09)  Чего-то я до конца не понимаю. Для начала несколько цитат из Страуструппа: Почему для j2 игнорируется цитата 1, а для j1 цитата два? Встроенные типы НЕ имеют конструкторов по умолчанию. j1 скорее всего располагается в "zero-initialized" области
|
|
|
|
Сообщений в этой теме
jorikdima __no_init и конструктор в С++ Jan 19 2011, 21:00 Artem_Petrik Раз оно так много места занимает, то, наверно, в п... Jan 19 2011, 23:11 Aprox jorikdima
Может, убрать __no_init маcсивы из соста... Jan 20 2011, 06:38     dxp Цитата(jorikdima @ Jan 21 2011, 12:13) Не... Jan 21 2011, 09:27    Dima_G Цитата(dxp @ Jan 21 2011, 08:56) +1.
jo... Jan 21 2011, 06:26 jorikdima Век живи, век учись
А дело было так:
Я пишу на С+... Jan 21 2011, 21:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|