我们想重载 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。
最佳答案
除了比较之外不应该有任何开销,除非您使用虚方法,否则绑定(bind)是静态的。
当然有异常开销,但由于这是不应该发生的事情,您应该安全地忽略它。
关于c++ - 重载 placement new 运算符的额外成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11778079/