1

VC6 下的malloc 内存块布局

image.png

对应图中自上而下的内存消耗[debug mode]:
malloc(0x0c) ==>

4 + (4 * 8) + 0x0C + 4 + (2 * 4) + 4 = 0x40 byte
上下 cookes 的数值 0x41 说明: 0x41 = 0x40 + 1b

 16 byte(00010000b)对齐时低 4 位一定为 0,借助最后一位标记此块内存是否被使 01000000b + 1b = 01000001
  • 考虑 cookie 的占用比,在实际工程中的往往是海量的小区块,cookie 会占用较高的空间比率
  • 去除 cookie 的条件:管理的元素大小一致

VC6 标准分配器的实现

VC6 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计

VC6 所附的标准库,其 std::allocator 实现如下(<xmemory>)

image.png

BC5 标准分配器的实现

BC5 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计

BC5 所附的标准库,其 std::allocator 实现如下(memory.stl)

image.png

G2.9 标准分配器的实现

G2.9 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计

G2.9 所附的标准库,其 std::allocator 实现如下(<defalloc.h>)

image.png

(不要使用这个文件,除非您有一个旧的容器实现,需要一个带有hp风格接口的分配器。SGI STL使用不同的分配器接口。sgi风格的分配器没有对象类型的参数化,它们在void*指针中传输。这个文件不包括在其他SGI STL头文件中)

G2.9 容器使用的分配器,不是 std::allocator 而是 std::alloc

image.png

而今安在?(G2.9)std::alloc VS (G4.9)__poll_alloc

image.png

image.png

G4.9 标准分配器的实现

G4.9 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计

image.png

4.9 pool allocator 用例

注意:连续内存间隔为 8 bytes,说明无 cookie 存在

image.png

#include <iostream>
#include <ext\pool_allocator.h>
#include <vector>

using namespace std;

template <typename Alloc>
void cookies_test(Alloc alloc, size_t n)
{
    typename Alloc::value_type *p1, *p2, *p3;

    p1 = alloc.allocate(n);
    p2 = alloc.allocate(n);
    p3 = alloc.allocate(n);

    cout << "p1=" << p1 << '\t';
    cout << "p2=" << p2 << '\t';
    cout << "p3=" << p3 << '\n';

    alloc.deallocate(p1, sizeof(typename Alloc::value_type));
}

int main()
{
    cout << sizeof(__gnu_cxx::__pool_alloc<int>) << endl;
    vector<int, __gnu_cxx::__pool_alloc<int>> vecPool;

    cookies_test(__gnu_cxx::__pool_alloc<double>(), 1);
    cookies_test(__gnu_cxx::__pool_alloc<double>(), 1);

    return 0;
}

输出:

1
p1=0xeb8128    p2=0xeb8130    p3=0xeb8138
p1=0xeb8140    p2=0xeb8148    p3=0xeb8150

TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧