2

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

4

2 回答 2

3

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

图像中包含的调试符号表包含有关程序中定义的每个项目的信息。当您在类中移动 anenum和 a时,与 the和 the 的struct元素相关的名称会变大: become 、become等。所有这些较长的字符串都会占用图像文件中的额外空间,使其更大。enumstructA::amyClass::A::aA::bmyClass::A::b

剥离调试符号应该使两个代码产生相同大小的图像。

于 2015-01-08T17:32:09.267 回答
3

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

于 2015-01-08T17:20:47.407 回答