0

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

4

1 回答 1

1

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

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

于 2012-08-02T13:12:57.990 回答