我正在尝试解决一个c问题,其中我的代码的两个部分为sizeof()运算符返回不同的结果。
这是我经营的
MyClass* foo = new MyClass();
int size = sizeof(*foo)
我将这段代码放在项目的两个不同部分,我得到了两个不同的结果。一次是2254,另一次是2284。我可以查看内存布局,一个区域显示内部成员为字节对齐,另一个区域显示为字对齐。
我观察dissasmly,发现sizeof()值实际上是机器代码的一部分。这是编译器还是链接器中的bug?为什么同一个项目的两个部分会以不同的方式查看同一个类?
编辑:
让我提供一个更明确的例子,我只是跑来表明这不是网上解决违规。
我刚上了一个全新的班
class TestAlignClass
{
public:
TestAlignClass() { }
~TestAlignClass() { }
private:
char charArray[3];
int myInt;
};
如果类与4对齐,它应该返回sizeof()=8,这就是我想要的。但是我的代码中有一些类返回sizeof()=7。
事实上,当我进入new()运算符时,有时它分配7个字节,有时它分配8个字节。
我将几个项目链接在一起,起初我认为这与项目设置有关,但同一项目的不同部分会显示差异。
sizeof
在编译时评估。
至于为什么sizeof
在两个不同的地方为同一个构造返回不同的值,这些类必须在不同的翻译单元中以某种方式定义不同。
我首先要看的一个地方是包装。如果一个TU中有一个#pragma pack(1)
类型表达式,而另一个TU中没有,这可能解释了差异。它也可能表明违反了单一定义规则,但那是另一回事。
另一个可能更奇特的东西是存在#ifdef
类型的宏,它会影响类的一部分。
正如@MooingDuck在注释中正确观察到的,bug极有可能在您的代码中。不要假设编译器有缺陷。