重载放置新运营商的额外成本是多少?

时间:2012-08-02 13:08:15

标签: c++ performance g++ operator-overloading placement-new

我们想要重置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。

1 个答案:

答案 0 :(得分:1)

除了使用虚方法之外,除了比较之外不应该有任何开销,绑定是静态的。

当然有异常开销,但由于这是不应该发生的事情,你应该安全地忽略它。