【发布时间】:2012-07-31 11:03:31
【问题描述】:
我们想要重载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。
【问题讨论】:
-
当您使用它时,您应该检查对齐方式:
assert(reinterpret_cast<uintptr_t>(where) % alignof(A) == 0)等。 -
@KerrekSB 我怎么会错过这个:-/我通常是对齐警察:-D
-
“过早的优化是编程中万恶之源(或至少大部分)”。在你面对它们之前,不要考虑性能惩罚。当你面对他们时,权衡可能的改进与努力
-
@KerrekSB - 你能解释一下为什么在这种情况下测试对齐很重要吗?而且,你知道替换
allignof是 C++11 功能吗,我必须使用 g++3.x.x (C++03 std)。 -
@PiotrNycz 因为
char的对齐要求没有其他类型那么严格。顺便提一句。alignof()也应该是 gcc 扩展(不确定他们何时添加,但应该是很久以前的)。
标签: c++ performance g++ operator-overloading placement-new