【问题标题】:What is the extra cost of overloading placement new operator?重载placement new 运算符的额外成本是多少?
【发布时间】: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 &gt; MAXSIZE) 的唯一成本吗? 换句话说,这种重新定义的性能损失是什么:

class PlacementNewNOP {
public:
  void* operator new (size_t size, void* where)
  {
     return where;
  }
};

也许在这个问题上并不重要 - 但是: 这是而且必须是 C++03。我们无法升级到 C++11。而且 boost 也不是一个选项,只有 C++03。

【问题讨论】:

  • 当您使用它时,您应该检查对齐方式:assert(reinterpret_cast&lt;uintptr_t&gt;(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


【解决方案1】:

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

当然会有异常开销,但既然这是不应该发生的事情,你应该可以放心地忽略它。

【讨论】:

  • 你能说说你为什么这么认为吗?我的意思是,你能解释一下 g++ 编译器是如何在内部实现这种放置新运算符重载的吗?
  • @PiotrNycz 因为重载是在编译期间解决的,而不是在运行时解决的。在运行时它将是一个简单的函数调用。同样,所有方法(除非虚拟)都是静态绑定的。
  • 那么,与没有放置新运算符重载的情况相比,这将是“简单函数调用”的开销还是没有开销?
  • @PiotrNycz 在这两种情况下你都会接到一个电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多