我正在使用 armcc 编译器开发一些嵌入式软件。出于调试目的,优化保持在 -O0 标志的最小值。为了提高代码清晰度,我将一些枚举和结构定义移动到具有公共访问权限的类中。
由此:
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有一些优化激活)引起的,用直接值替换枚举但不确定这一点。可能导致代码大小增加的原因(如果是这种情况,则会阻止优化)?
答案 0 :(得分:3)
C ++名称修改将与在类中声明的结构和枚举不同
例如,如果您的类在参数列表中包含带有struct C的方法,则会发生这种情况
使用gcc的快速测试显示了一种方法:
void func( struct C *) ;
当在类中声明struct时调用_ZN7myClass4funcEPNS_1CE
,如果在类之外声明结构,则调用_ZN7myClass4funcEP1C
。
我没有armcc来测试,但我相信它的行为是一样的。
答案 1 :(得分:3)
对于这两个版本,都有嵌入elf的调试数据。
图像中包含的调试符号表包含有关程序中定义的每个项目的信息。当您在班级中移动enum
和struct
时,与enum
和struct
的元素相关的名称会变大:A::a
变为{{ 1}},myClass::A::a
变为A::b
,依此类推。所有这些较长的字符串在图像文件中占用了额外的空间,使其更大。
Stripping the debug symbols应该使两个代码生成相同大小的图像。