gpt4 book ai didi

c++ - 如何以相当可移植的方式以编程方式检查内存使用情况? (C/C++)

转载 作者:IT老高 更新时间:2023-10-28 22:26:18 25 4
gpt4 key购买 nike

我正在编写跨平台 C++ 代码(Windows、Mac)。有没有办法检查当前进程正在使用多少内存?一个非常人为的片段来说明:

unsigned long m0 = GetMemoryInUse();
char *p = new char[ random_number ];
unsigned long m1 = GetMemoryInUse();
printf( "%d bytes used\n", (m1-m0) );

当然 (m1-m0) 应该等于 random_number,但我正在尝试在更复杂的级别上执行此操作,包括可以分配内存的可能的库调用。

以下是不可取的:

  1. 使用 Valgrind(或其同类)
  2. 使用自定义内存分配器进行跟踪分配的内存。

最佳答案

这是我编写的一些代码,试图以可移植的方式执行此操作。它并不完美,但我认为它至少应该指出如何在多个平台上执行此操作。

(P.S. 我经常使用 OSX 和 Linux,并且知道这很好用。我很少使用 Windows,所以注意事项适用于 Windows 子句,但我认为它是正确的。)

#ifdef __linux__
# include <sys/sysinfo.h>
#endif

#ifdef __APPLE__
# include <mach/task.h>
# include <mach/mach_init.h>
#endif

#ifdef _WINDOWS
# include <windows.h>
#else
# include <sys/resource.h>
#endif

/// The amount of memory currently being used by this process, in bytes.
/// By default, returns the full virtual arena, but if resident=true,
/// it will report just the resident set in RAM (if supported on that OS).
size_t memory_used (bool resident=false)
{
#if defined(__linux__)
// Ugh, getrusage doesn't work well on Linux. Try grabbing info
// directly from the /proc pseudo-filesystem. Reading from
// /proc/self/statm gives info on your own process, as one line of
// numbers that are: virtual mem program size, resident set size,
// shared pages, text/code, data/stack, library, dirty pages. The
// mem sizes should all be multiplied by the page size.
size_t size = 0;
FILE *file = fopen("/proc/self/statm", "r");
if (file) {
unsigned long vm = 0;
fscanf (file, "%ul", &vm); // Just need the first num: vm size
fclose (file);
size = (size_t)vm * getpagesize();
}
return size;

#elif defined(__APPLE__)
// Inspired by:
// http://miknight.blogspot.com/2005/11/resident-set-size-in-mac-os-x.html
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count);
size_t size = (resident ? t_info.resident_size : t_info.virtual_size);
return size;

#elif defined(_WINDOWS)
// According to MSDN...
PROCESS_MEMORY_COUNTERS counters;
if (GetProcessMemoryInfo (GetCurrentProcess(), &counters, sizeof (counters)))
return counters.PagefileUsage;
else return 0;

#else
// No idea what platform this is
return 0; // Punt
#endif
}

关于c++ - 如何以相当可移植的方式以编程方式检查内存使用情况? (C/C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/372484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com