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