mirror of
https://git.sb/baoshuo/OI-codes.git
synced 2024-11-30 20:56:29 +00:00
112 lines
3.5 KiB
C++
112 lines
3.5 KiB
C++
|
|
||
|
#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
|
||
|
|
||
|
#include <cpuid.h>
|
||
|
|
||
|
#include <iostream>
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
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) << "MB" << std::endl;
|
||
|
|
||
|
return 0;
|
||
|
}
|