当我阅读 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
// 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;
}
};
这是一个调试模板。
我可以看到它确保分配的空间始终大于 8 字节,并且我还可以看到它通过 using 替换了从 __result 地址开始的内容,*(size_t*)__result = __n;
但我真的很困惑这样做的目的。
为什么分配空间然后用 __n 替换内容?为什么然后返回__result + (int) _S_extra;
并定义char* __real_p = (char*)__p - (int) _S_extra;
?请详细解释内存的功能void* allocate(size_t __n)
和void deallocate(void* __p, size_t __n)
工作方式。
源代码链接:https ://github.com/karottc/sgi-stl/blob/master/concept_checks.h