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

时间:2013-06-28 19:40:17

标签: c++ compiler-construction linker sizeof

我正在尝试解决c ++问题,其中我的代码的两部分为sizeof()运算符返回不同的结果。

这是我跑的

MyClass* foo = new MyClass();
int size = sizeof(*foo)

我将此代码放在项目的两个不同部分中,得到两个不同的结果。有一次是2254,另一次是2284.我可以查看内存布局,一个区域显示内部成员为字节对齐,另一个区域是字对齐。

我查看了dissasmbly并看到sizeof()值实际上是机器代码的一部分。这会是编译器或链接器中的错误吗?为什么同一个项目的两个部分以不同的方式查看同一个类?

编辑:

让我提供一个更清晰的例子,我刚刚开始表明这不是ODR违规行为。

我刚刚创建了一个全新的课程

class TestAlignClass
{
public:  
    TestAlignClass() { }
    ~TestAlignClass() { }

private:
    char charArray[3];
    int myInt;
};

如果类与4对齐,则应返回sizeof()= 8,这就是我想要的。但是我的代码中有某些类返回sizeof()= 7。

事实上,当我进入new()运算符时,有时它会分配7个字节,有时会分配8个字节。

我将几个项目连接在一起,我认为它首先与项目设置有关,但同一项目的不同部分会显示出差异。

1 个答案:

答案 0 :(得分:8)

sizeof在编译时进行评估。

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

我首先要看的是包装。如果在一个TU中存在#pragma pack (1)类型表达式而在另一个TU中没有,则可以解释差异。它也可能表明违反了One Definition Rule,但这是另一个故事。

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

正如@MooingDuck在评论中正确观察到的那样,错误很可能出现在您的代码中。不要认为编译器有缺陷。