我正在尝试解决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个字节。
我将几个项目连接在一起,我认为它首先与项目设置有关,但同一项目的不同部分会显示出差异。
答案 0 :(得分:8)
sizeof
在编译时进行评估。
至于为什么sizeof
在两个不同的地方为同一个构造返回不同的值,必须在不同的翻译单元中以某种方式对这些类进行不同的定义。
我首先要看的是包装。如果在一个TU中存在#pragma pack (1)
类型表达式而在另一个TU中没有,则可以解释差异。它也可能表明违反了One Definition Rule,但这是另一个故事。
另一个,也许更奇特的东西是#ifdef
类型的宏的存在,它影响了类的一部分。
正如@MooingDuck在评论中正确观察到的那样,错误很可能出现在您的代码中。不要认为编译器有缺陷。