在64位上,SP_DEVINFO_LIST_DETAIL_DATA_W的大小为560。它不是554吗?

typedef struct _SP_DEVINFO_LIST_DETAIL_DATA_W {
  DWORD  cbSize;
  GUID   ClassGuid;
  HANDLE RemoteMachineHandle;
  WCHAR  RemoteMachineName[SP_MAX_MACHINENAME_LENGTH];
} SP_DEVINFO_LIST_DETAIL_DATA, *PSP_DEVINFO_LIST_DETAIL_DATA;


cbSize为4,ClassGuid为16,RemoteMachineHandle为8(64位),RemoteMachineName为2 *(260 + 3)(SP_MAX_MACHINENAME_LENGTH为MAX_PATH + 3)

因此,4 + 16 + 8 + 2 * 263 = 554。为什么sizeof(_SP_DEVINFO_LIST_DETAIL_DATA_W)返回560?

最佳答案

您忽略了对齐字段的要求,这对于确保处理器可以有效地访问它们很重要。以x64为目标时,HANDLE类型为64位8字节。因此,RemoteMachineHandle成员与8的倍数的偏移量对齐。偏移量将其从偏移量20移动到偏移量24,下一偏移量可被8整除。多余的4个字节被填充,并且未使用。

这使得结构大小为4 + 16 + 4 + 8 + 2 * 263 = 558字节。

还有一个额外的问题-此结构的数组会使句柄再次失准。索引为1的元素的句柄的偏移量为558 + 4 + 16 + 4 =582。它不是8的倍数,该成员将再次错位。

因此,编译器在结构的末尾添加了额外的2个填充字节,因此结构的总大小为8的倍数。因此:

Offset  Size    Member
   0      4     cbSize
   4     16     ClassGuid
  20      4     -
  24      8     RemoteMachineHandle
  32    526     RemoteMachineName
 558      2     -
-------------
        560

关于c++ - C++-SP_DEVINFO_LIST_DETAIL_DATA_W的大小为64位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21064540/

10-13 00:41