我正在尝试使用boost::pool
中的#include "boost/pool/pool.hpp"
内存池
我想检查一下boost::pool
分配了多少内存,所以我运行命令system("ps aux | grep myProgramExe | grep -v grep | awk '{print $5}'");
,它给我(来自ps
手册页)VSZ - virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias 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
这很奇怪,因为:
一个。我只想分配4个字节(next allocation
应该只有1个实例)
湾当块结束且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
个字节(我认为这只是池头而已)
湾当块结束时,内存是免费的。
析
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
这很奇怪,
一个。出于某种原因,已经分配了大小(在我调用pool.malloc()
之前
湾delete
中的尺寸不是免费的。
这可以解释吗?
我是否需要使用其他工具而不是ps
来查看程序使用的内存?
答案 0 :(得分:1)
这可以解释吗?
是
我是否需要使用其他工具而不是ps来查看程序使用的内存?
你正在看到程序使用的内存。
您没有考虑到的内容:内存分配例程已经过大量优化。对于各种场景,库(如libc)将使用各种策略来更快地进行分配/重新分配。以下是一些常见的内存管理策略:
从操作系统中抢先请求内存;这允许应用程序执行相同类型的后续内部分配,而无需从操作系统请求更多内存的成本;
缓存已释放的内存;这允许应用程序重用内存(从操作系统接收)以进行后续分配(同样,避免与操作系统讨论它的开销)