Цитата(xelax @ Aug 7 2009, 11:27)

А конструктор не может на этапе компиляции проинлайниться? это во первых
Во вторых в ячейку он может и занесёт, но это справидливо только для eeprom. А если это структура в RAM, то числа сначала лягут во флэш, а потом скопируются в инициализационном коде в оперативку. Так что бесплатность условная.
Проинлайненый код - всё равно код, его размер не может быть даже равен размеру данных, которые он в себе несёт.
Код копирования образа .data во флеше присутствует один на все инициализаторы и делится на всех, практически можно пренебречь.
Итого для
Код
uint8_t b = 5;
имеем
Код
.byte 5
т.е. расход 1 батйт флеша на 1 байт проинициализированных данных (+ одна N-тая от общего кода копирования всей секции одним махом из флеша в ОЗУ)
А в случае самого заинлайненого конструктора
Код
ldi r16, 5
sts b, r16
итого шесть байт флеша на один байт проинициализированных данных.
Реальность может оказаться ещё хуже - даже проинлайненный конструктор ляжет в цепочку таких проинлайненных конструкторов в пределах единицы компиляции, но все вместе образуют подпрограмму, которая будет вызвана при запуске, а её адрес или её вызов будет помещён в соответствующую таблицу, которая ещё займёт место.
Например, так:
Код
#include <stdint.h>
class cpp_t {
public:
cpp_t(uint8_t v8, uint32_t v32) : f8(v8), f32(v32) {}
private:
uint8_t f8;
uint32_t f32;
};
cpp_t cp_alone(3,0x12345678);
cpp_t cp[2] = { cpp_t(0,1), cpp_t(2,3) };
CODE
.text
.type _GLOBAL__I_c, @function
// Да, тут проинлайнились конструкторы для всех трёх объектов в одну цепочку
_GLOBAL__I_c:
/* prologue: function */
/* frame size = 0 */
ldi r24,lo8(3)
sts cp_alone,r24
ldi r24,lo8(305419896)
ldi r25,hi8(305419896)
ldi r26,hlo8(305419896)
ldi r27,hhi8(305419896)
sts cp_alone+1,r24
sts (cp_alone+1)+1,r25
sts (cp_alone+1)+2,r26
sts (cp_alone+1)+3,r27
sts cp,__zero_reg__
ldi r24,lo8(1)
ldi r25,hi8(1)
ldi r26,hlo8(1)
ldi r27,hhi8(1)
sts cp+1,r24
sts (cp+1)+1,r25
sts (cp+1)+2,r26
sts (cp+1)+3,r27
ldi r24,lo8(2)
sts cp+5,r24
ldi r24,lo8(3)
ldi r25,hi8(3)
ldi r26,hlo8(3)
ldi r27,hhi8(3)
sts cp+6,r24
sts (cp+6)+1,r25
sts (cp+6)+2,r26
sts (cp+6)+3,r27
/* epilogue start */
ret
.global __do_global_ctors
.section .ctors,"a",@progbits
// А это добавилась ссылка на объединённые конструкторы в таблицу
.word gs(_GLOBAL__I_c)
.section .bss
.type cp_alone, @object
.size cp_alone, 5
cp_alone:
.skip 5,0
.global cp
.global cp
.type cp, @object
.size cp, 10
cp:
.skip 10,0
Даже если бы компилятор уоптимизировал эти записи, загрущив один раз указательную пару и записывая по ней - всё равно в пределе расход при программной инициализации 4 байта флеша на байт проинициализированных даных, а при переносе образа - 1:1.
В этом смысле можно сказать, что
добавление одной проинициализированной "по С" переменной бесплатно по коду (код копирования уже присутствует), а добавление "по С++" кроме самих инициализаторов добавляет коды операций загрузки этих инициализаторов в регистры и команды выгрузки их на нужное место.
Прикиньте, что будет при инициализации таблично-заданного развесистого меню в стиле с конструкторами.