Created
May 2, 2023 12:44
-
-
Save renbaoshuo/07aa76a414210520a3f681c7a0656d80 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <cpuid.h> | |
#include <stdint.h> | |
#if defined(_WIN32) | |
#include <Windows.h> | |
#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) | |
#include <sys/param.h> | |
#include <sys/types.h> | |
#include <unistd.h> | |
#if defined(BSD) | |
#include <sys/sysctl.h> | |
#endif | |
#else | |
#error "Unable to define getMemorySize() for an unknown OS." | |
#endif | |
static void cpuid(uint32_t func, uint32_t sub, uint32_t data[4]) { | |
__cpuid_count(func, sub, data[0], data[1], data[2], data[3]); | |
} | |
/** | |
* Returns the size of physical memory (RAM) in bytes. | |
*/ | |
size_t getMemorySize() { | |
#if defined(_WIN32) && (defined(__CYGWIN__) || defined(__CYGWIN32__)) | |
/* Cygwin under Windows. ------------------------------------ */ | |
/* New 64-bit MEMORYSTATUSEX isn't available. Use old 32.bit */ | |
MEMORYSTATUS status; | |
status.dwLength = sizeof(status); | |
GlobalMemoryStatus(&status); | |
return (size_t)status.dwTotalPhys; | |
#elif defined(_WIN32) | |
/* Windows. ------------------------------------------------- */ | |
/* Use new 64-bit MEMORYSTATUSEX, not old 32-bit MEMORYSTATUS */ | |
MEMORYSTATUSEX status; | |
status.dwLength = sizeof(status); | |
GlobalMemoryStatusEx(&status); | |
return (size_t)status.ullTotalPhys; | |
#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) | |
/* UNIX variants. ------------------------------------------- */ | |
/* Prefer sysctl() over sysconf() except sysctl() HW_REALMEM and HW_PHYSMEM */ | |
#if defined(CTL_HW) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)) | |
int mib[2]; | |
mib[0] = CTL_HW; | |
#if defined(HW_MEMSIZE) | |
mib[1] = HW_MEMSIZE; /* OSX. --------------------- */ | |
#elif defined(HW_PHYSMEM64) | |
mib[1] = HW_PHYSMEM64; /* NetBSD, OpenBSD. --------- */ | |
#endif | |
int64_t size = 0; /* 64-bit */ | |
size_t len = sizeof(size); | |
if (sysctl(mib, 2, &size, &len, NULL, 0) == 0) | |
return (size_t)size; | |
return 0L; /* Failed? */ | |
#elif defined(_SC_AIX_REALMEM) | |
/* AIX. ----------------------------------------------------- */ | |
return (size_t)sysconf(_SC_AIX_REALMEM) * (size_t)1024L; | |
#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) | |
/* FreeBSD, Linux, OpenBSD, and Solaris. -------------------- */ | |
return (size_t)sysconf(_SC_PHYS_PAGES) * (size_t)sysconf(_SC_PAGESIZE); | |
#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGE_SIZE) | |
/* Legacy. -------------------------------------------------- */ | |
return (size_t)sysconf(_SC_PHYS_PAGES) * (size_t)sysconf(_SC_PAGE_SIZE); | |
#elif defined(CTL_HW) && (defined(HW_PHYSMEM) || defined(HW_REALMEM)) | |
/* DragonFly BSD, FreeBSD, NetBSD, OpenBSD, and OSX. -------- */ | |
int mib[2]; | |
mib[0] = CTL_HW; | |
#if defined(HW_REALMEM) | |
mib[1] = HW_REALMEM; /* FreeBSD. ----------------- */ | |
#elif defined(HW_PYSMEM) | |
mib[1] = HW_PHYSMEM; /* Others. ------------------ */ | |
#endif | |
unsigned int size = 0; /* 32-bit */ | |
size_t len = sizeof(size); | |
if (sysctl(mib, 2, &size, &len, NULL, 0) == 0) | |
return (size_t)size; | |
return 0L; /* Failed? */ | |
#endif /* sysctl and sysconf variants */ | |
#else | |
return 0L; /* Unknown OS. */ | |
#endif | |
} | |
int main() { | |
uint32_t data[4]; | |
char str[48]; | |
for (int i = 0; i < 3; ++i) { | |
cpuid(0x80000002 + i, 0, data); | |
for (int j = 0; j < 4; ++j) { | |
reinterpret_cast<uint32_t*>(str)[i * 4 + j] = data[j]; | |
} | |
} | |
size_t memorySize = getMemorySize(); | |
std::cout << "CPU: " << str << std::endl; | |
std::cout << "Memory: " << (memorySize / (1024 * 1024)) << "MiB" << std::endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment