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

Dan*_*Dan 4 c++ compiler-construction linker sizeof

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

这就是我的经历

MyClass* foo = new MyClass();
int size = sizeof(*foo)
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

让我提供一个更清晰的例子,我刚刚跑来表明这不是ODR违规.

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

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

private:
    char charArray[3];
    int myInt;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joh*_*ing 8

sizeof 在编译时进行评估.

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

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

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

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

  • @DanQ:顺便说一句,`sizeof`返回'7`强烈地告诉我包装正在某处发生.现代CPU不对齐7字节边界.:)(免责声明:我不做嵌入式系统.买家要小心.) (2认同)