VC6 下的malloc 内存块布局
对应图中自上而下的内存消耗[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>)
BC5 标准分配器的实现
BC5 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计
BC5 所附的标准库,其 std::allocator 实现如下(memory.stl)
G2.9 标准分配器的实现
G2.9 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计
G2.9 所附的标准库,其 std::allocator 实现如下(<defalloc.h>)
(不要使用这个文件,除非您有一个旧的容器实现,需要一个带有hp风格接口的分配器。SGI STL使用不同的分配器接口。sgi风格的分配器没有对象类型的参数化,它们在void*指针中传输。这个文件不包括在其他SGI STL头文件中)
G2.9 容器使用的分配器,不是 std::allocator 而是 std::alloc
而今安在?(G2.9)std::alloc VS (G4.9)__poll_alloc
G4.9 标准分配器的实现
G4.9 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(), 没有任何特殊设计
4.9 pool allocator 用例
注意:连续内存间隔为 8 bytes,说明无 cookie 存在
#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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。