c++ - 重载 placement new 运算符的额外成本是多少?

标签 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<> 类,但在发布代码中我考虑删除它。根据您的经验,您认为如果不删除这个额外的测试类,我们的性能会损失多少?这是否只是此验证的成本 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/

相关文章:

c++ - 为什么将参数传递给 g++ 的顺序很重要

c++ - 使用 -mpopcnt 编译会导致 Illegal instruction 错误

c++ - 写一个makefile把一个.h .hpp和.cpp一起编译成可执行文件

c++ - 为什么我的类(class)没有通过Qt QUDPSocket接收UDP数据报?

c++ - 在 Spirit:Qi 中构建自定义表达式树(没有 Utree 或 Boost::Variant)

performance - 当内存中数据网格优于 NoSQL/NoSQL + 分布式缓存时

javascript - 是什么导致相同数量的循环具有不同的性能?

C++ 获取应用程序目录 *NIX

c++ - 在同一硬件单元上创建多个线程

mysql 查询需要300多秒