c++ - boost::pool 实内存分配

标签 c++ boost memory-pool boost-pool

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

我遇到了一些奇怪的事情:

  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 个字节(下一个分配 应该只有 1 个实例)。
b.当 block 结束并且 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 字节(我认为这只是头顶上的池)。
b.当 block 结束时,内存被释放。

  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

这很奇怪,
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/

相关文章:

c++ - 元组是否有隐含的字典序比较?

c++ - 如何复制/粘贴图像数据?

c++ - boost iostreams 断言失败

c++ - 压入 STL 堆栈是通过引用传递的,但是堆栈是否复制了值?

c++ - ioService.post(boost::bind(&myFunction, this, attr1, attri2) 不发布工作

c++ - 使用 Allegro 图形库 boost 单元测试

C memcpy 导致段错误

c++ - 使用 boost singleton_pool 的自定义分配比默认慢

c++ - 从空指针初始化类/结构

c++ - 为 `.mp3` 文件编辑注册表