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

Declaring a type (enum, struct etc.) in class definition increase code size

我正在使用 armcc 编译器开发一些嵌入式软件。出于调试目的,使用 -O0 标志将优化保持在最低限度。为了提高代码的清晰度,我 将一些枚举和结构定义移到了具有 public 访问权限的 class 中。

来自这里:

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 时有一些优化处于活动状态)引起的,但对此不确定。什么可能导致代码大小增加(或者阻止优化,如果是这种情况)?

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

For both builds there are debug data embedded into elf.

图像中包含的调试符号 table 包含有关程序中定义的每个项目的信息。当你把enumstruct移到[=24=里面时,enumstruct的元素相关的名称会变大:A::a 变为 myClass::A::aA::b 变为 myClass::A::b,依此类推。所有这些较长的字符串在图像文件中占用额外的 space,使其变大。

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