【问题标题】:Declaring a type (enum, struct etc.) in class definition increase code size在类定义中声明类型(枚举、结构等)会增加代码大小
【发布时间】:2015-01-08 16:46:41
【问题描述】:

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

【问题讨论】:

  • 每次创建类实例时都会分配成员变量(预定义或用户定义)...
  • 在程序集上尝试差异
  • 我没有声明额外的变量。只是将定义移到了类中。
  • 我很抱歉提出一个愚蠢的问题,但是您在测量图像大小之前从图像中删除了调试数据,对吧? (link to an explanation on how to do it, in case you didn't)
  • @Faruxx 这就是你的解释:调试符号变长了,因为以前叫A::a 现在叫myClass::A::a,以前叫A::b 现在叫myClass::A::b , 等等。所有这些较长的字符串都会占用额外的空间,从而使图像更大。去除调试符号应该使两个代码产生相同大小的图像。

标签: c++ armcc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多