在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/