假设sizeof(T) <= sizeof(void*)
,以下内容定义明确/可移植吗? ...
void* storage = 0;
new (&storage) T(t);
如果是的话,这似乎可以用作明智的小对象优化。
最佳答案
您正在传递一个有效的地址,如果指向的内存足够大以包含该对象,并且其对齐方式与该对象兼容,那么它就是完美的代码。
如果sizeof(T) <= sizeof(storage)
,则对齐应该隐式正确。 。但您可能会对此感到偏执并明确设置它:
alignas(T) void* storage = 0;
虽然我认为实际上并不需要手动设置对齐方式,并且 sizeof(T) <= sizeof(storage)
意味着可以保证正确对齐,但我不能 100% 确定。
请注意,只是因为 storage
的类型是 void*
没有任何意义。标准将这个特定的新展示位置定义为:
void* operator new(std::size_t count, void* ptr);
地址参数为void*
,意味着指向的类型可以是任何类型。唯一的要求是它是有效内存的地址。
但是,如果 storage
一旦超出范围,如果其中包含的对象需要被破坏,你就会被破坏。你需要在 storage
之前调用析构函数超出范围。
另请注意,“放置删除”(如果需要,会自动调用此函数,不可能编写执行此操作的代码)实际上永远不会释放内存。所以storage
即使调用了放置删除(例如构造函数抛出异常时),位于堆栈上仍然没问题。
关于c++ - 使用 void* 位作为存储的新布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779096/