C++ Sizeof给出了不可预测的结果

Mig*_*l P 4 c++ debugging visual-c++

可能重复:
为什么'sizeof'给出错误的测量?

我有一个名为CBUFFER_PEROBJECT的结构:

struct CBUFFER_PEROBJECT
{
    D3DXMATRIX Final;
    D3DXMATRIX Rotation;
};
Run Code Online (Sandbox Code Playgroud)

在另一堂课中,我这样做:

...
bd.ByteWidth = sizeof(CBUFFER_PEROBJECT); 
...
Run Code Online (Sandbox Code Playgroud)

我发现D3DXMATRIX的大小是64,所以64 + 64 = 128(对吧?).但我的编译器正在玩我的技巧(Visual C++),因为当我调试程序时,bd.ByteWidth变为132,所以我去了立即窗口(Visual Studio),并输入:

sizeof(D3DXMATRIX) + sizeof(D3DXMATRIX)
Run Code Online (Sandbox Code Playgroud)

结果是:

128
Run Code Online (Sandbox Code Playgroud)

但是bd.ByteWidth变为132,当我在"立即窗口"中键入以下内容时:

sizeof(CBUFFER_PEROBJECT)
Run Code Online (Sandbox Code Playgroud)

它给了我:

128
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 6

对了,你是混乱D3DMATRIXD3DXMATRIX(第二类型注额外X).第一个是16个浮点值的纯矩阵(恰好是64个字节).后者是一个类,它显然在结构中的某处有4个字节的额外数据.也许是一个vtable或一些这样的.

如果您将代码编译为C而不是C++,那么大小将是相同的,因为提供结构的后者的头文件就是这样typedef D3DMATRIX D3DXMATRIX;.

请参阅:D3DXMATRIXD3DMATRIX

编辑:这有点像关于军方的老笑话"如果地图和现实不匹配,地图是对的".在这种情况下,如果您不同意编译器,那就错了.在计算大小时,编译器始终是正确的.理解为什么编译器得到了这个数字,那么这是另一回事......通常通过将预期的偏移量与实际发生的结果进行比较来解决,并了解什么,如果有什么导致"差距".

  • 代码中使用的D3DMATRIX在哪里? (4认同)
  • 为什么这更合理 - 64字节数据后跟64字节数据不需要4字节对齐. (2认同)