提问者:小点点

sizeof()值是由编译器还是链接器决定的?


我正在尝试解决一个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个字节。

我将几个项目链接在一起,起初我认为这与项目设置有关,但同一项目的不同部分会显示差异。


共1个答案

匿名用户

sizeof在编译时评估。

至于为什么sizeof在两个不同的地方为同一个构造返回不同的值,这些类必须在不同的翻译单元中以某种方式定义不同。

我首先要看的一个地方是包装。如果一个TU中有一个#pragma pack(1)类型表达式,而另一个TU中没有,这可能解释了差异。它也可能表明违反了单一定义规则,但那是另一回事。

另一个可能更奇特的东西是存在#ifdef类型的宏,它会影响类的一部分。

正如@MooingDuck在注释中正确观察到的,bug极有可能在您的代码中。不要假设编译器有缺陷。