这个程序是否格式不正确?
#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
必须为该大小的任何对象返回正确对齐的指针,但该对象的类型是什么?它不知道(并且对齐取决于类型),因此它必须为所有可能类型的实例提供正确对齐的指针,并且由于“较小”类型的最大对齐小于“较大”类型,指针应该正确对齐。
答案 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
运算符,就会自动调用它。