Объявление типа (enum, struct и т. Д.) В определении класса увеличивает размер кода

Я разрабатываю некоторые встроенные программы с 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, когда активны некоторые оптимизации) замены перечислений прямыми значениями, но не уверен в этом. Что могло вызвать увеличение размера кода (или помешать оптимизации, если это так)?

2

Решение

Для обеих сборок есть отладочные данные, встроенные в elf.

Таблица символов отладки, включенная в изображение, содержит информацию о каждом элементе, определенном в вашей программе. Когда вы двигаете enum и struct внутри класса, имена, связанные с элементами enum и struct стать больше: A::a становится myClass::A::a, A::b становится myClass::A::b, и так далее. Все эти более длинные строки занимают дополнительное место в файле изображения, делая его больше.

Снятие символов отладки Нужно сделать так, чтобы два кода создавали изображения одинакового размера.

3

Другие решения

Изменение названия C ++ будет отличаться от структур и перечислений, объявленных в классе.
Это может произойти, например, если у вашего класса есть методы со структурой C в списке аргументов.
Быстрый тест с использованием gcc показывает, что метод:
void func( struct C *) ;
будет называться _ZN7myClass4funcEPNS_1CE когда структура объявлена ​​в классе и _ZN7myClass4funcEP1C если структура объявлена ​​вне класса.
У меня нет теста armcc, но я бы поверил, что он ведет себя так же.

3

По вопросам рекламы [email protected]