Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++;? 在C++中,是否可以获得当前RAM和CPU使用率?是否存在与平台无关的函数调用_C++_Cpu Usage_Ram - Fatal编程技术网

如何在C++;? 在C++中,是否可以获得当前RAM和CPU使用率?是否存在与平台无关的函数调用

如何在C++;? 在C++中,是否可以获得当前RAM和CPU使用率?是否存在与平台无关的函数调用,c++,cpu-usage,ram,C++,Cpu Usage,Ram,没有,标准中没有 如果您确实需要这些信息,您必须编写特定于平台的ifdef或针对提供这些信息的库的链接。遗憾的是,这些信息严重依赖于底层操作系统,因此不存在与平台无关的调用。(可能有一些包装器框架,但我不知道有。) 在Linux上,您可以查看函数调用,在Windows上,您可以使用RAM。还可以看看Windows中的其他功能。据我所知,没有与平台无关的功能。如果您计划针对多个版本的Windows,请注意某些版本的实现有所不同。例如,我在测试NT 3.51下的应用程序时遇到了这个问题。。。(我知道

没有,标准中没有


如果您确实需要这些信息,您必须编写特定于平台的ifdef或针对提供这些信息的库的链接。

遗憾的是,这些信息严重依赖于底层操作系统,因此不存在与平台无关的调用。(可能有一些包装器框架,但我不知道有。)


在Linux上,您可以查看函数调用,在Windows上,您可以使用RAM。还可以看看Windows中的其他功能。

据我所知,没有与平台无关的功能。如果您计划针对多个版本的Windows,请注意某些版本的实现有所不同。例如,我在测试NT 3.51下的应用程序时遇到了这个问题。。。(我知道是古语)

下面是一些我用于内存方面的代码。这在windows以外的平台上不起作用,在没有WIN32定义的情况下编译时只返回0:

编辑:我忘了提一下,这段代码被分割并舍入到最接近的MB,因此到处都是>>20

// get memory info...
int getTotalRAM()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullTotalPhys>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwTotalPhys>>20);
    }
#endif
    return ret;
}

int getAvailRAM()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullAvailPhys>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwAvailPhys>>20);
    }
#endif
    return ret;
}

int getTotalMemory()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20);
    }
#endif
    return ret;
}

int getAvailMemory()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20);
    }
#endif
    return ret;
}
//获取内存信息。。。
int getTotalRAM()
{
int-ret=0;
#ifdef WIN32
DWORD v=GetVersion();
德沃德大调=(德沃德)(洛比特)(洛沃德(五));
德沃德小调=(德沃德)(希比特)(洛沃德(五));
德沃德大厦;
如果(v<0x8000000)构建=(DWORD)(HIWORD(v));
else-build=0;
//因为编译器静态链接函数。。。
BOOL(u stdcall*GMSEx)(lpmemorystaturex)=0;
HINSTANCE hIL=LoadLibrary(L“kernel32.dll”);
GMSEx=(BOOL(uu stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL,“GlobalMemoryStatusEx”);
if(GMSEx)
{
记忆状态m;
m、 dwLength=sizeof(m);
if(GMSEx&m))
{
ret=(int)(m.ullTotalPhys>>20);
}
}
其他的
{
记忆状态m;
m、 dwLength=sizeof(m);
GlobalMemoryStatus(&m);
ret=(int)(m.dwTotalPhys>>20);
}
#恩迪夫
返回ret;
}
int getAvailRAM()
{
int-ret=0;
#ifdef WIN32
DWORD v=GetVersion();
德沃德大调=(德沃德)(洛比特)(洛沃德(五));
德沃德小调=(德沃德)(希比特)(洛沃德(五));
德沃德大厦;
如果(v<0x8000000)构建=(DWORD)(HIWORD(v));
else-build=0;
//因为编译器静态链接函数。。。
BOOL(u stdcall*GMSEx)(lpmemorystaturex)=0;
HINSTANCE hIL=LoadLibrary(L“kernel32.dll”);
GMSEx=(BOOL(uu stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL,“GlobalMemoryStatusEx”);
if(GMSEx)
{
记忆状态m;
m、 dwLength=sizeof(m);
if(GMSEx&m))
{
ret=(int)(m.ullavalphys>>20);
}
}
其他的
{
记忆状态m;
m、 dwLength=sizeof(m);
GlobalMemoryStatus(&m);
ret=(int)(m.dwAvailPhys>>20);
}
#恩迪夫
返回ret;
}
int getTotalMemory()
{
int-ret=0;
#ifdef WIN32
DWORD v=GetVersion();
德沃德大调=(德沃德)(洛比特)(洛沃德(五));
德沃德小调=(德沃德)(希比特)(洛沃德(五));
德沃德大厦;
如果(v<0x8000000)构建=(DWORD)(HIWORD(v));
else-build=0;
//因为编译器静态链接函数。。。
BOOL(u stdcall*GMSEx)(lpmemorystaturex)=0;
HINSTANCE hIL=LoadLibrary(L“kernel32.dll”);
GMSEx=(BOOL(uu stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL,“GlobalMemoryStatusEx”);
if(GMSEx)
{
记忆状态m;
m、 dwLength=sizeof(m);
if(GMSEx&m))
{
ret=(int)(m.ullTotalPhys>>20)+(int)(m.ullTotalVirtual>>20);
}
}
其他的
{
记忆状态m;
m、 dwLength=sizeof(m);
GlobalMemoryStatus(&m);
ret=(int)(m.dwTotalPhys>>20)+(int)(m.dwTotalVirtual>>20);
}
#恩迪夫
返回ret;
}
int getAvailMemory()
{
int-ret=0;
#ifdef WIN32
DWORD v=GetVersion();
德沃德大调=(德沃德)(洛比特)(洛沃德(五));
德沃德小调=(德沃德)(希比特)(洛沃德(五));
德沃德大厦;
如果(v<0x8000000)构建=(DWORD)(HIWORD(v));
else-build=0;
//因为编译器静态链接函数。。。
BOOL(u stdcall*GMSEx)(lpmemorystaturex)=0;
HINSTANCE hIL=LoadLibrary(L“kernel32.dll”);
GMSEx=(BOOL(uu stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL,“GlobalMemoryStatusEx”);
if(GMSEx)
{
记忆状态m;
m、 dwLength=sizeof(m);
if(GMSEx&m))
{
ret=(int)(m.ullAvailPhys>>20)+(int)(m.ullAvailVirtual>>20);
}
}
其他的
{
记忆状态m;
m、 dwLength=sizeof(m);
GlobalMemoryStatus(&m);
ret=(int)(m.dwAvailPhys>>20)+(int)(m.dwAvailVirtual>>20);
}
#恩迪夫
返回ret;
}
不是直接的

但您可以使用抽象操作系统的库(如ACE)。

不过,如果您只需要CPU和内存,这可能会有点沉重。

没有独立于平台的方法可以做到这一点。尽管对于windows,您可以通过在代码中使用PDH.dll(performance Data Helper)及其相关API来获取CPU使用率和性能指标


有一个开放源代码库,跨多个平台提供这些(以及更多系统信息):


我在相当大的项目中使用过它,它工作得很好(除了OSX上的某些角落案例等)。

在Linux上,它将使用/proc/self/status。需要做更多的工作才能将其转化为一个数字。我发现这很有用,因为它只是将内存使用情况作为字符串直接打印到屏幕上

static string memory_usage() {
        ostringstream mem;
        PP("hi");
        ifstream proc("/proc/self/status");
        string s;
        while(getline(proc, s), !proc.fail()) {
                if(s.substr(0, 6) == "VmSize") {
                        mem << s;
                        return mem.str();
                }
        }
        return mem.str();
}
静态字符串内存\u用法(){
ostringstream mem;
PP(“hi”);
ifstream proc(“/proc/self/status”);
字符串s;
而(getline(proc,s),!proc.fail()){
如果(s.substr(0,6)=“VmSize”){

mem如果情况仍然如此,请检查:

它给出了一个如何获得CPU的示例