boost :: pool实内存分配

时间:2015-03-09 13:08:25

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

我正在尝试使用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}'");
    }
    
  2. 输出结果为:

    1. 18908
    2. 19040
    3. 19040
    

    这很奇怪,因为:
    一个。我只想分配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}'");
      }
      
    2. 输出:

      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}'");
        }
        
      2. 输出:

        7. 19040
        8. 19040
        9. 19040
        

        这很奇怪,
        一个。出于某种原因,已经分配了大小(在我调用pool.malloc()之前 湾delete中的尺寸不是免费的。

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

1 个答案:

答案 0 :(得分:1)

  

这可以解释吗?

  

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

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

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

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

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