C++ 这个分配器如何起到调试的作用?
当我阅读SGI/STL的源代码时,我注意到C++ 这个分配器如何起到调试的作用?,c++,stl,allocator,sgi,C++,Stl,Allocator,Sgi,当我阅读SGI/STL的源代码时,我注意到 template <class _Alloc> class debug_alloc { private: enum {_S_extra = 8}; // Size of space used to store size. Note // that this must be large enough to preserve // ali
template <class _Alloc>
class debug_alloc {
private:
enum {_S_extra = 8}; // Size of space used to store size. Note
// that this must be large enough to preserve
// alignment.
public:
static void* allocate(size_t __n)
{
char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra);
*(size_t*)__result = __n;
return __result + (int) _S_extra;
}
static void deallocate(void* __p, size_t __n)
{
char* __real_p = (char*)__p - (int) _S_extra;
assert(*(size_t*)__real_p == __n);
_Alloc::deallocate(__real_p, __n + (int) _S_extra);
}
static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz)
{
char* __real_p = (char*)__p - (int) _S_extra;
assert(*(size_t*)__real_p == __old_sz);
char* __result = (char*)
_Alloc::reallocate(__real_p, __old_sz + (int) _S_extra,
__new_sz + (int) _S_extra);
*(size_t*)__result = __new_sz;
return __result + (int) _S_extra;
}
};
模板
类debug_alloc{
私人:
枚举{u S_extra=8};//用于存储大小的空间大小。注意
//这个必须足够大才能保存下来
//对齐。
公众:
静态空*分配(大小)
{
char*uuu result=(char*)u Alloc::allocate(uuu n+(int)u S_uextra);
*(大小*)\uuuu结果=\uu n;
返回结果+(整数)\u额外;
}
静态无效解除分配(无效*\u p,大小\u t\n)
{
char*\uuuu real\u p=(char*)\uuuu p-(int)\u S\u extra;
断言(*(大小t*)\uuuu实值p==\uuu n);
_Alloc::解除分配(uuu real_p,uuu n+(int)_S_extra);
}
静态void*重新分配(void*\uuu p、size\u t\uu旧sz、size\u t\uu新sz)
{
char*\uuuu real\u p=(char*)\uuuu p-(int)\u S\u extra;
断言(*(大小t*)实际值p===旧值sz);
char*\uuuu结果=(char*)
_Alloc::重新分配(uuu real_p,uu old_sz+(int)_S_extra,
__新的_sz+(int)_S_额外);
*(大小*)\uuuuu结果=\uu新的\uu深;
返回结果+(整数)\u额外;
}
};
这是一个调试模板
我可以看到它确保分配的空间始终大于8字节,并且我还可以看到它使用*(size\u t*)\u result=\u替换从u result地址开始的内容代码>但是我真的很困惑这个的目的
为什么要分配空间,然后用u\n替换内容?
那么为什么要返回\uuuu结果+(int)\u S\u额外值编码>并定义char*\uuuu real\u p=(char*)\uuuu p-(int)\u S\u extra代码>?
请详细解释函数void*allocate(size\t\u\n)
和void deallocate(void*\u\p,size\u\u\n)
如何在内存上工作
链接到源代码:此分配器在每个分配之前使用一个8字节的头来记录其大小。通常在实际分配旁边存储这样的元数据。尽管标头包含4字节的int,但8字节确保返回的指针与8字节对齐,这是较大类型的常见要求
正如您可以从代码中读取的那样,allocate请求n+8字节(调用结果分配p),将大小存储在开头并返回p+8
取消分配和重新分配是指针p+8,因此必须先减去才能返回实际分配。有关\u S_extra
@molbdnilo的注释中描述了目的。我的英语读得很好。我问这个问题的原因似乎很明显,我不明白它是如何处理对齐的。它似乎只是跟踪分配大小并确保释放的大小相同,我认为它所做的只是你没有问到的对齐。您询问了其用途,即存储分配的大小以便进行验证。在不知道自己到底不明白的情况下,很难回答它是如何工作的。