我想在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中很常见。