一旦分配就重用内存空间

时间:2013-07-11 17:20:28

标签: c++ memory-management

这个程序是否格式不正确?

#include <new>

struct A
{
  int a;
  int b;
};

struct B
{
  int a;
};

int main()
{    
  void* p(operator new(sizeof(A)));
  new (p) A();
  static_cast<A*>(p)->~A();

  new (p) B();
  static_cast<B*>(p)->~B();

  operator delete(p);
}

请注意,我们保证p将与A类型正确对齐。但是类型B怎么样?标准是否提到了什么?有没有标准的方法来重新对齐p

编辑:我觉得接受的答案需要更多解释。 operator new必须为该大小的任何对象返回正确对齐的指针,但该对象的类型是什么?它不知道(并且对齐取决于类型),因此它必须为所有可能类型的实例提供正确对齐的指针,并且由于“较小”类型的最大对齐小于“较大”类型,指针应该正确对齐。

2 个答案:

答案 0 :(得分:2)

标准规定operator new的结果应适合所有类型。但是,这不包括SSE类型等扩展对齐类型。

答案 1 :(得分:-2)

如果在sizeof表达式中使用A和B的并集,则只有纯粹主义者会抱怨。像这样:

union AllocObject {
    A a;
    B b;
};

main() {
    char* p = new char[sizeof AllocObject];
    ...
}

但是,如果您担心new性能,您应该考虑自己实现全局分配运算符:

void* operator new (size_t size) {
    void* result = malloc(size);
    if(!result) throw(bad_alloc());    //Just for standard conformance, unnecessary on Linux...
    return result;
}

void operator delete (void *pointer) {
    free(pointer);
}

当然,你可能做得更好,但即使上面的代码比我机器上的内置版本快100个CPU周期......

请注意,将其链接到程序中的C ++文件就足够了,只要程序使用new运算符,就会自动调用它。