在类定义中声明类型(枚举,结构等)会增加代码大小

时间:2015-01-08 16:46:42

标签: c++ armcc

我正在使用 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有一些优化激活)引起的,用直接值替换枚举但不确定这一点。可能导致代码大小增加的原因(如果是这种情况,则会阻止优化)?

2 个答案:

答案 0 :(得分:3)

C ++名称修改将与在类中声明的结构和枚举不同 例如,如果您的类在参数列表中包含带有struct C的方法,则会发生这种情况 使用gcc的快速测试显示了一种方法:
void func( struct C *) ;
当在类中声明struct时调用_ZN7myClass4funcEPNS_1CE,如果在类之外声明结构,则调用_ZN7myClass4funcEP1C
我没有armcc来测试,但我相信它的行为是一样的。

答案 1 :(得分:3)

  

对于这两个版本,都有嵌入elf的调试数据。

图像中包含的调试符号表包含有关程序中定义的每个项目的信息。当您在班级中移动enumstruct时,与enumstruct的元素相关的名称会变大:A::a变为{{ 1}},myClass::A::a变为A::b,依此类推。所有这些较长的字符串在图像文件中占用了额外的空间,使其更大。

Stripping the debug symbols应该使两个代码生成相同大小的图像。