0

我正在尝试使用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).

我得到了一些奇怪的东西:

  1. 代码(代码缩进 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 个字节(next allocation应该只有 1 个实例)。
湾。当块结束并且pool死亡时,内存没有被释放。

  1. 现在我想分配大小为 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字节(我认为这只是头顶的池)。
湾。当块结束时,内存被释放。

  1. 析构函数

    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

这很奇怪,
一个。由于某种原因,已经分配了大小(在我调用 .b 之前)。大小没有pool.malloc()在.
delete

这可以解释吗?
我是否需要使用其他工具而不是ps查看程序使用的内存?

4

1 回答 1

1

这可以解释吗?

是的。

我是否需要使用其他工具而不是 ps 来查看程序使用的内存?

正在查看程序使用的内存。

您没有考虑到的内容:内存分配例程进行了高度优化。对于各种场景,库(如 libc)将使用各种策略来更快地进行分配/重新分配。以下是一些常见的内存管理策略:

  • 从操作系统抢先请求内存;这允许应用程序执行相同类型的后续内部分配,而无需从操作系统请求更多内存;

  • 缓存释放的内存;这允许应用程序重用内存(从操作系统接收)以进行后续分配(再次避免与操作系统讨论它的开销)

于 2015-03-09T13:44:37.787 回答