visual-studio-2012 - 为什么 vtable 指针在 x86 编译程序上对齐到 8 个字节?

标签 visual-studio-2012 memory-management windbg memory-alignment

我在一段代码中有以下结构(在 x86 上编译):

0:012> dt prog!_TESTSTRUCT
   +0x000 __VFN_table : Ptr32 
   +0x008 szAddr           : Ptr32 Wchar
   +0x00c szOpCode         : Ptr32 Wchar
   +0x010 szMnemonic       : Ptr32 Wchar
   +0x014 szArgs           : Ptr32 Wchar
   +0x018 addr             : Uint8B
   +0x020 nextOffset       : Uint8B

如您所见,vtable ptr 虽然大小为 4 个字节,但与 8 个字节对齐。

作为引用,这里是同一段代码中的另一个结构,通常是对齐的:
0:012> dt prog!_TESTSTRUCT2
   +0x000 __VFN_table : Ptr32 
   +0x004 pClient          : Ptr32 IDebugClient5
   +0x008 pDebugControl    : Ptr32 IDebugControl4
   +0x00c pDebugSystemObjects : Ptr32 IDebugSystemObjects
   +0x010 pDebugDataSpaces : Ptr32 IDebugDataSpaces
   +0x014 pDebugSymbols    : Ptr32 IDebugSymbols3
   +0x018 handlesAcquired  : Bool

为什么 x86 上的 32 位 ptr 与第一个结构中的 8 个字节对齐?我在这里缺少什么?

编辑 1:
class _TESTSTRUCT   size(40):
1>      +---
1>   0  | {vfptr}
1>   8  | szAddr
1>  12  | szOpCode
1>  16  | szMnemonic
1>  20  | szArgs
1>  24  | addr
1>  32  | nextOffset
1>      +---
1>  
1>  _TESTSTRUCT::$vftable@:
1>      | &_TESTSTRUCT_meta
1>      |  0
1>   0  | &_TESTSTRUCT::{dtor}
1>  
1>  _TESTSTRUCT::{dtor} this adjustor: 0
1>  _TESTSTRUCT::__delDtor this adjustor: 0
1>  _TESTSTRUCT::__vecDelDtor this adjustor: 0

class _TESTSTRUCT2  size(28):
1>      +---
1>   0  | {vfptr}
1>   4  | pDebugClient
1>   8  | pDebugControl
1>  12  | pDebugSystemObjects
1>  16  | pDebugDataSpaces
1>  20  | pDebugSymbols
1>  24  | handlesAcquired
1>      | <alignment member> (size=3)
1>      +---
1>  
1>  _TESTSTRUCT2::$vftable@:
1>      | &_TESTSTRUCT2_meta
1>      |  0
1>   0  | &_TESTSTRUCT2::{dtor}
1>  
1>  _TESTSTRUCT2::{dtor} this adjustor: 0
1>  _TESTSTRUCT2::__delDtor this adjustor: 0
1>  _TESTSTRUCT2::__vecDelDtor this adjustor: 0

最佳答案

正如这里所解释的

http://lolengine.net/blog/2012/10/21/the-stolen-bytes

8 字节结构成员导致 vfptr 未对齐到 8 字节而不是 4 字节,因为 vfptr 在所有其他成员添加/对齐后添加到结构中。此行为似乎是 Visual Studio 特定的

关于visual-studio-2012 - 为什么 vtable 指针在 x86 编译程序上对齐到 8 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27764464/

相关文章:

visual-studio-2012 - 使用发布到 AWS 进行 Web.config 转换

c++ - 在 std::map 中使用 TiXmlElement vector

c++ - 尽管 dllExport 正确,但没有函数导出到 DLL - Visual Studio

处理类对象的 MATLAB 弱引用

c++ - 进程挂起调试 C/C++

windows - 使用 WinDbg 设置远程内核调试器

windows - 在windbg中找不到符号路径

c++ - 执行程序时调用任何 cURL 函数都会导致 "entry point not found"

c - 我是否转换 mkl_malloc 的结果?

c++ - 在自定义堆栈分配器中释放内存