Я разрабатываю некоторые встроенные программы с ARMCC компилятор. В целях отладки оптимизация поддерживается на минимуме с -O0 флаг. Для улучшения ясности кода у меня есть перенес некоторые определения enum и struct в класс с открытым доступом.
Из этого:
enum A{
a,
b,
c,
d
};
struct C{
int q;
int w;
int e;
};
class myClass{
....
};
К этому:
class myClass{
public:
enum A{
a,
b,
c,
d
};
struct C{
int q;
int w;
int e;
};
....
};
И достигая их через myClass, как;
myClass::C new_struct;
new_struct.q= myClass::a;
Но, к моему удивлению, даже без разницы в коде он увеличил размер кода до 600 байт. Я предполагаю, что это вызвано оптимизацией компилятора (даже при -O0, когда активны некоторые оптимизации) замены перечислений прямыми значениями, но не уверен в этом. Что могло вызвать увеличение размера кода (или помешать оптимизации, если это так)?
Для обеих сборок есть отладочные данные, встроенные в elf.
Таблица символов отладки, включенная в изображение, содержит информацию о каждом элементе, определенном в вашей программе. Когда вы двигаете enum
и struct
внутри класса, имена, связанные с элементами enum
и struct
стать больше: A::a
становится myClass::A::a
, A::b
становится myClass::A::b
, и так далее. Все эти более длинные строки занимают дополнительное место в файле изображения, делая его больше.
Снятие символов отладки Нужно сделать так, чтобы два кода создавали изображения одинакового размера.
Изменение названия C ++ будет отличаться от структур и перечислений, объявленных в классе.
Это может произойти, например, если у вашего класса есть методы со структурой C в списке аргументов.
Быстрый тест с использованием gcc показывает, что метод:
void func( struct C *) ;
будет называться _ZN7myClass4funcEPNS_1CE
когда структура объявлена в классе и _ZN7myClass4funcEP1C
если структура объявлена вне класса.
У меня нет теста armcc, но я бы поверил, что он ведет себя так же.