我们想要重载placement new 操作符,只是为了验证使用的内存大小对于给定的类是否足够。我们知道这个尺寸。构造或多或少是这样的:
template <size_t MAXSIZE>
class PlacementNewTest {
public:
void* operator new (size_t size, void* where)
{
if (size > MAXSIZE) {
throw bad_alloc();
}
return where;
}
};
假设在这种简化的上下文中使用:
char buffer[200];
class A : public PlacementNewTest<sizeof buffer> {
public:
char a[100];
};
class B : public A {
public:
char b[200];
};
int main() {
A* a = new (buffer) A; // OK
a->~A();
B* b = new (buffer) B; // throwed bad_alloc
b->~B();
}
在测试阶段,我使用了这个 PlacementNewTest<> 类,但在发布代码中我考虑将其删除。你认为,根据你的经验,如果不删除这个额外的测试类,这将花费我们多少性能?这是验证的唯一成本if (size > MAXSIZE)
吗?换句话说,这种重新定义的性能损失是多少:
class PlacementNewNOP {
public:
void* operator new (size_t size, void* where)
{
return where;
}
};
也许这在这个问题上并不重要——但是:这是而且必须是 C++03。我们无法升级到 C++11。而 boost 也不是一个选项,只有 C++03。