【发布时间】:2011-01-21 15:26:27
【问题描述】:
已编辑:重新措辞的问题。
调用new和malloc时,传递要分配的内存块大小:
void* malloc(size_t);
void* operator new(size_t);
是否可以获取类型信息,也就是说,您可以执行 sizeof(T) ,其中 T 是分配内存的类型:
T t = new T;
我想重载 new 和 malloc,但需要类型信息而不仅仅是分配的内存大小。
进一步编辑:
我这样做的原因是我会重载malloc。此函数将检查正在分配的内存大小并从特定的内存池中分配:
template <int v> struct int2type { value = v };
inline void* malloc(const std::size_t sz)
{
if(sz <= 64)
{
size_obj* ptr = malloc(nggt::core::int2type<sizeof(size_obj) + (sz % 8)>);
ptr->sz = sz;
return ptr+1;
}
else if(sz <= 128)
{
size_obj* ptr = malloc(nggt::core::int2type<sizeof(size_obj) + 128>);
ptr->sz = sz;
return ptr+1;
}
else
{
return TSuper::malloc(sz);
}
}
inline void* malloc(const nggt::core::int2type<sizeof(size_obj) + 8> sz)
{
return m_heap8.malloc(sz.value);
}
inline void* malloc(const nggt::core::int2type<sizeof(size_obj) + 16> sz)
{
return m_heap16.malloc(sz.value);
}
还支持使用空闲列表将内存返回到池中的空闲重载。问题是我不能在模板中使用size_t sz,因为它在编译时是未知的。如果我能得到类型信息,我可以做sizeof(T) 并完成!
干杯, 格雷姆
【问题讨论】:
-
“什么叫这些”是什么意思?另请注意,
new确实 not 采用size_t(它基本上采用任何可转换为整数类型的东西)。 -
对不起,伙计,我听不懂你的英语。
-
你需要这个做什么?你有什么目的?
-
已编辑以包含背景。
标签: c++