我正在尝试使用 #include "boost/pool/pool.hpp"
中的 boost::pool
内存池。
我想检查用 boost::pool
分配了多少内存,所以我运行命令 system("ps aux | grep myProgramExe | grep -v grep | awk '{print $5}' ");
这给了我(来自 ps
手册页)VSZ - 进程的虚拟内存大小,以 KiB(1024 字节为单位)为单位。目前排除了设备映射;这可能会发生变化。 (别名 vsize)。
我遇到了一些奇怪的事情:
代码(代码缩进 4 个空格,再加上 4 个空格,因为它嵌入在列表中)
int main() { { boost::pool<> pool(4, 1); system("ps aux | grep boostHash | grep -v grep | awk '{print \"1. \" $5}'"); void *a = pool.malloc(); pool.free(a); system("ps aux | grep boostHash | grep -v grep | awk '{print \"2. \" $5}'"); } system("ps aux | grep boostHash | grep -v grep | awk '{print \"3. \" $5}'"); }
输出是:
1. 18908
2. 19040
3. 19040
这很奇怪,因为:
A。我只想分配 4 个字节(下一个分配
应该只有 1 个实例)。
b.当 block 结束并且 pool
已死时,内存不会被释放。
现在我想分配大小为 128 的实例,我想在下一次分配中分配 1024:
int main() { { boost::pool<> pool(128, 1024); system("ps aux | grep boostHash | grep -v grep | awk '{print \"4. \" $5}'"); void *a = pool.malloc(); pool.free(a); system("ps aux | grep boostHash | grep -v grep | awk '{print \"5. \" $5}'"); } system("ps aux | grep boostHash | grep -v grep | awk '{print \"6. \" $5}'"); }
输出:
4. 18908
5. 19040
6. 18908
这很好,因为:
一个。我想分配 128 * 1024 = 131072
字节,得到 19040 - 18908 = 132KB = 135168
字节。 135168 - 131072 = 4096
字节(我认为这只是头顶上的池)。
b.当 block 结束时,内存被释放。
析构函数
int main() { { boost::pool<> *pool = new boost::pool<>(128, 1024); system("ps aux | grep boostHash | grep -v grep | awk '{print \"7. \" $5}'"); void *a = pool->malloc(); pool->free(a); delete pool; system("ps aux | grep boostHash | grep -v grep | awk '{print \"8. \" $5}'"); } system("ps aux | grep boostHash | grep -v grep | awk '{print \"9. \" $5}'"); }
输出:
7. 19040
8. 19040
9. 19040
这很奇怪,
A。由于某种原因,大小已经分配(在我调用 pool.malloc()
之前)。
b. delete
中未释放大小。
这可以解释吗?
我是否需要使用其他工具而不是 ps
来查看程序使用的内存?
最佳答案
Is this explainable?
是的。
Do I need to use another tool instead of ps to see the memory used by the program?
您正在看到程序使用的内存。
您没有考虑到的是:内存分配例程经过了大量优化。对于各种场景,库(如 libc)将使用各种策略来加快分配/重新分配速度。以下是一些常见的内存管理策略:
从操作系统抢先请求内存;这允许应用程序执行相同类型的后续内部分配,而无需从操作系统请求更多内存;
缓存释放的内存;这允许应用程序为后续分配重用内存(从操作系统接收)(再次避免与操作系统讨论它的开销)
关于c++ - boost::pool 实内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28942772/