我们想要重置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&lt;&gt;使用的类,但在发布代码中我考虑删除它。你认为,根据你的经验,这将花费我们的性能多少,而不是删除这个额外的测试类?这只是验证if (size > MAXSIZE)
的唯一成本吗?
换句话说,这种重新定义的性能损失是什么:
class PlacementNewNOP {
public:
void* operator new (size_t size, void* where)
{
return where;
}
};
也许这个问题不重要 - 但是: 这是,而且必须是C ++ 03。我们无法升级到C ++ 11。并且boost也不是一个选项,只是C ++ 03。
答案 0 :(得分:1)
除了使用虚方法之外,除了比较之外不应该有任何开销,绑定是静态的。
当然有异常开销,但由于这是不应该发生的事情,你应该安全地忽略它。