3

我正在尝试在 Windows 中使用(相当新的)GetLogicalProcessorInformationEx 函数。它给出的 ReturnLength 没有意义。

较旧的 GetLogicalProcessorInformation 给出了合理的结果......

ReturnLength = 0;
Result = GetLogicalProcessorInformation(NULL, &ReturnLength);
printf("GLPI (%d): %d %d\n",
       Result,
       sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION),
       ReturnLength);

这是输出(2 核,64 位,Win7 机器): GLPI (0): 32 416

换句话说,该函数将使用 416/32=13 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 结构填充我传递的缓冲区。

对于 GetLogicalProcessorInformationEx,这是我的电话...

ReturnLength = 0;
Result = GetLogicalProcessorInformationEx(RelationProcessorCore,
                                          NULL, &ReturnLength);
printf("GLPIX (%d): %d %d %d\n",
       Result,
       sizeof(PROCESSOR_RELATIONSHIP),
       sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX),
       ReturnLength);

这是输出(2 核,64 位,Win7 机器): GLPIX (0): 40 80 96

Microsoft 文档 (http://msdn.microsoft.com/en-us/library/windows/desktop/dd405488(v=vs.85).aspx) 表明该函数将返回 PROCESSOR_RELATIONSHIP 或 SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX 结构,具体取决于第一个参数的值。ReturnLength 表明它也不会返回,尽管 - 96 不能被 sizeof(PROCESSOR_RELATIONSHIP) 或 sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) 整除。

我还为第一个参数尝试了 RelationAll,它给出了 768 的 ReturnLength - 也不是倍数或 40 或 80。

任何人都可以解释一下吗?

4

1 回答 1

1

您需要相信函数返回给您的内容。必然如此,联合中的结构具有不可预测的大小。特别是 PROCESSOR_RELATIONSHIP 的这个成员:

  GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];

ANYSIZE_ARRAY 宏是一个提示,它表示 GroupMask 数组的大小是可变的,并且取决于 GroupCount 成员的值。在结构上使用 sizeof 永远不会给你正确的大小,它会太小。请务必使用返回的大小为结构分配存储空间,如下所示:

SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX* buf = 
    (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)malloc(ReturnLength);

这种模式在 C 和 winapi 中很常见。

于 2012-12-30T18:51:22.130 回答