【发布时间】: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, 等等。所有这些较长的字符串都会占用额外的空间,从而使图像更大。去除调试符号应该使两个代码产生相同大小的图像。