如何以C++;? 我希望我的程序读取它在C++中运行的CPU的缓存行大小。

如何以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

我知道这是不可移植的,所以我需要一个针对Linux的解决方案和另一个针对Windows的解决方案(其他系统的解决方案可能对其他系统有用,所以如果你知道的话就发布它们)

对于Linux,我可以读取/proc/cpuinfo的内容并解析以cache\u对齐开始的行。也许有一种更好的方法涉及对API的调用


对于Windows,我完全不知道。

看起来至少SCO unix()有用于sysconf的缓存线。可能其他平台也有类似的功能?

在Win32上,将返回包含a的,包含您所需信息的。我想您需要从
ntdll.dll
获取x86的指令。快速的谷歌搜索显示了一些Win32和C++。我也通过内联汇编程序使用了CPUID

更多信息:


在Linux上尝试,一种独立于体系结构的C API,用于在Windows上读取/proc/cpuinfo

#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来获取此信息吗?回到这里后,我不相信我回答了你的问题,这是关于缓存线大小而不是内存页面大小是否正确的问题?我在谷歌上搜索页面大小片段(正在处理一个涉及内存访问的项目)来到这里,略读的危险。请解开我的答案,但可能值得留在这里供将来参考。