gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:23:28 26 4
gpt4 key购买 nike

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

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