gpt4 book ai didi

windows - 从 Windows GetLogicalProcessorInformationEx 函数混淆 ReturnLength

转载 作者:可可西里 更新时间:2023-11-01 10:38:02 24 4
gpt4 key购买 nike

我正在尝试在 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。

任何人都可以阐明吗?

最佳答案

您需要相信该函数返回给您的内容。必然如此,联合中的结构具有不可预测的大小。特别是 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 中很常见。

关于windows - 从 Windows GetLogicalProcessorInformationEx 函数混淆 ReturnLength,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com