【发布时间】:2011-10-24 21:16:30
【问题描述】:
SP_DEVICE_INTERFACE_DETAIL_DATA 是一个可变长度结构,以一个包含其大小的字段开头,后跟一个数组(不是指向一个的指针)。
用所需的数组长度分配此结构的便捷方法是什么?
【问题讨论】:
标签: c++ winapi struct memory-management
SP_DEVICE_INTERFACE_DETAIL_DATA 是一个可变长度结构,以一个包含其大小的字段开头,后跟一个数组(不是指向一个的指针)。
用所需的数组长度分配此结构的便捷方法是什么?
【问题讨论】:
标签: c++ winapi struct memory-management
我按照 MSalters 的建议做了:
std::vector<char> rawbuf(sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + bufferlen);
SP_DEVICE_INTERFACE_DETAIL_DATA* pDIDD =
reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>(&rawbuf[0]);
编辑:
按照 Raymond Chen 的示例(也讨论过 on his blog),我可以按如下方式分配 SP_DEVICE_INTERFACE_DETAIL_DATA 结构:
PSP_DEVICE_INTERFACE_DETAIL_DATA pDIDD =
malloc(FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA,
DevicePath[bufferlen]));
【讨论】:
malloc 应该与 free 匹配,但 std::unique-ptr 将调用 delete。更简单:std::vector<char> rawbuf(sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + bufferlen); SP_DEVICE_INTERFACE_DETAIL_DATA* ptr = reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>(&rawbuf[0]);
FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA, DevicePath[arraysize])。还要注意std::vector<char> 只保证char-alignment,它比SP_DEVICE_INTERFACE_DETAIL_DATA-alignment 弱。您可能会在某些处理器上出现对齐错误。
SP_DEVICE_INTERFACE_DETAIL_DATA,你必须分配一个连续的缓冲区。 DevicePath[0] 是结构的最后一个元素和数组的第一个元素。因此,应该正确解释“如何分配数组长度”的问题。至于 std::allocator 的对齐,AFAICT 在 Windows 上不是问题(因为 std::vector<char> 缓冲区在那里对齐)并且在其他所有地方都不是问题(因为 SP_DEVICE_INTERFACE_DETAIL_DATA 仅适用于 Windows)。
std::vector<char> 将被对齐以供任意使用的保证在哪里?我可以看到一个实现,如果向量很小,std::vector<char> 使用内联缓冲区,如果向量很大,则下降到堆中。该内联缓冲区可能未对齐。 (我认为你错过了DevicePath[arraysize] 的[arraysize] 部分。)