c++ - 使用 void* 位作为存储的新布局

标签 c++ placement-new

假设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/

相关文章:

c++ - 使用 placement new 延迟真正的基类构造

c++ - 关于如何在基于动态数组的结构中存储键值对的想法

c++ - 为什么在引用类型上使用新的放置会给我带来段错误,即使使用 std::launder 也是如此?

c++ - Regexec() 没有给出期望的结果

c++ - 更改对话框的背景颜色mfc

c++ - 既然 "this"关键字在 C++ 中通常是不必要的并且被省略,那么为什么在这个例子中它是必需的?

c++ - 关于删除表达式,C++ 中缺少 "placement delete"

c++ - 通过引用传递 std::optional<T> 是否实际上节省了复制?

c++ - 在c++中的macOS Catalina上编译 header 和cpp文件的问题

c++ - 在其他构造函数中调用复制构造函数