C++新的内存分配碎片

Jas*_* T. 4 c++ new-operator dynamic-memory-allocation

我试图查看新分配器的行为以及为什么它不会连续放置数据.

我的代码:

struct ci {
    char c;
    int i;
}

template <typename T>
void memTest()
{
    T * pLast = new T();
    for(int i = 0; i < 20; ++i) {
         T * pNew = new T();
         cout << (pNew - pLast) << " ";
         pLast = pNew;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我用char,int,ci运行它.大多数分配是从最后一个固定长度,有时从一个可用块到另一个块有奇怪的跳跃.

sizeof(char):1
平均跳转:64字节

sizeof(int):4
平均跳跃:16

sizeof(ci):8(int必须放在4字节对齐上)
平均跳转:9

任何人都可以解释为什么分配器像这样分段内存?另外,为什么char的跳转比int和包含int和char的结构大得多.

Pau*_*l R 10

有两个问题:

  • 大多数分配器在块开始之前存储一些额外的数据(通常是块大小和几个指针)

  • 通常有对齐要求,例如Linux通常分配给至少8字节边界,OS X分配给至少16字节边界

所以你几乎总是会在连续分配之间找到某种差距.

当然,你不应该依赖任何特定的行为来做这样的事情,其中​​的实现是随心所欲的.


Dra*_*sha 6

您的代码包含一个错误,要知道指向它们的指针的距离(char*),否则增量的大小为(T).