如何以C++;? 我希望我的程序读取它在C++中运行的CPU的缓存行大小。
我知道这是不可移植的,所以我需要一个针对Linux的解决方案和另一个针对Windows的解决方案(其他系统的解决方案可能对其他系统有用,所以如果你知道的话就发布它们) 对于Linux,我可以读取/proc/cpuinfo的内容并解析以cache\u对齐开始的行。也许有一种更好的方法涉及对API的调用如何以C++;? 我希望我的程序读取它在C++中运行的CPU的缓存行大小。,c++,windows,linux,cpu,C++,Windows,Linux,Cpu,我知道这是不可移植的,所以我需要一个针对Linux的解决方案和另一个针对Windows的解决方案(其他系统的解决方案可能对其他系统有用,所以如果你知道的话就发布它们) 对于Linux,我可以读取/proc/cpuinfo的内容并解析以cache\u对齐开始的行。也许有一种更好的方法涉及对API的调用 对于Windows,我完全不知道。看起来至少SCO unix()有用于sysconf的缓存线。可能其他平台也有类似的功能?在Win32上,将返回包含a的,包含您所需信息的。我想您需要从ntdll.d
对于Windows,我完全不知道。看起来至少SCO unix()有用于sysconf的缓存线。可能其他平台也有类似的功能?在Win32上,将返回包含a的,包含您所需信息的。我想您需要从
ntdll.dll
获取x86的指令。快速的谷歌搜索显示了一些Win32和C++。我也通过内联汇编程序使用了CPUID
更多信息:
#include <Windows.h>
#include <iostream>
using std::cout; using std::endl;
int main()
{
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
cout << "Page Size Is: " << systemInfo.dwPageSize;
getchar();
}
#包括
#包括
使用std::cout;使用std::endl;
int main()
{
系统信息系统信息;
GetSystemInfo(&systemInfo);
cout对于那些想知道如何在公认答案中使用函数的人来说,下面是示例代码:
#include <new>
#include <iostream>
#include <Windows.h>
void ShowCacheSize()
{
using CPUInfo = SYSTEM_LOGICAL_PROCESSOR_INFORMATION;
DWORD len = 0;
CPUInfo* buffer = nullptr;
// Determine required length of a buffer
if ((GetLogicalProcessorInformation(buffer, &len) == FALSE) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
{
// Allocate buffer of required size
buffer = new (std::nothrow) CPUInfo[len]{ };
if (buffer == nullptr)
{
std::cout << "Buffer allocation of " << len << " bytes failed" << std::endl;
}
else if (GetLogicalProcessorInformation(buffer, &len) != FALSE)
{
for (DWORD i = 0; i < len; ++i)
{
// This will be true for multiple returned caches, we need just one
if (buffer[i].Relationship == RelationCache)
{
std::cout << "Cache line size is: " << buffer[i].Cache.LineSize << " bytes" << std::endl;
break;
}
}
}
else
{
std::cout << "ERROR: " << GetLastError() << std::endl;
}
delete[] buffer;
}
}
#包括
#包括
#包括
void ShowCacheSize()
{
使用CPUInfo=系统逻辑处理器信息;
德沃德伦=0;
CPUInfo*buffer=nullptr;
//确定所需的缓冲区长度
if((GetLogicalProcessorInformation(buffer,&len)=FALSE)&&(GetLastError()==错误\u缓冲区不足))
{
//分配所需大小的缓冲区
buffer=new(std::nothrow)CPUInfo[len]{};
if(buffer==nullptr)
{
std::cout-Yikes-解码系统\逻辑\处理器\信息结构数组看起来会很痛苦。欢迎来到系统编程的世界。;)这还不算太糟糕,Michael。无论如何,掌握它会迫使你学习CPU拓扑结构是如何安排的,你可能需要知道。呜?没有代码片段我可以简单地复制y和粘贴?!天哪!你能评论一下如何使用CPUID来获取此信息吗?回到这里后,我不相信我回答了你的问题,这是关于缓存线大小而不是内存页面大小是否正确的问题?我在谷歌上搜索页面大小片段(正在处理一个涉及内存访问的项目)来到这里,略读的危险。请解开我的答案,但可能值得留在这里供将来参考。