c++ - std::aligned_storage 的目的是什么?

标签 c++ c++11 std

如果我理解正确的话,std::aligned_storage 的主要优点是它管理对齐。它还可以使用 memcpy() 进行复制,并且可以与 POD 类型一起使用。

但是!

1) POD 类型默认由编译器对齐,我们可以使用 #pragma pack(push, 1)

覆盖编译器的对齐方式

2) 默认情况下,我们可以使用memcpy() 复制POD(我们不应该为此做些什么)

所以我真的不明白为什么我们需要 std::aligned_storage

最佳答案

只要您希望将内存分配与对象创建分离,就可以使用 std::aligned_storage

您声称:

Also it is usable only with POD types.

但这不是真的。没有什么可以阻止 std::aligned_storage 与非 POD 类型一起使用。

The example on cppreference提供合法用例:

template<class T, std::size_t N>
class static_vector
{
    // properly aligned uninitialized storage for N T's
    typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];
    std::size_t m_size = 0;
...

这里的想法是,一旦构建了static_vector,就会立即为N 类型T 的对象分配内存,但是没有T 类型已创建。

你不能用一个简单的 T data[N]; 数组成员来做到这一点,因为这会立即为每个元素运行 T 的构造函数,或者不会如果 T 不是默认构造的,甚至可以编译。

关于c++ - std::aligned_storage 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50271304/

相关文章:

C++命名空间的基本用法

c++ - ostream 不打印添加两个 valarrays 的结果(使用运算符重载)

c++ - 将包含 unique_ptr 的结构项添加到 STL 容器

c++ - 我怎样才能让 C++0x 和 __STRICT_ANSI__ 相处融洽?

c++ - 为什么在c++14中定义了shared_timed_mutex,而在c++17中定义了shared_mutex?

c++ - 将字符串转换为 float ;无法正确清除 stringstream?

c++ - 引用 C++ 库函数导致任务行为不正确

c++ - 存在重载命名空间函数时需要 std::qualifier 吗?

c++ - 从集合列表中删除重复项

c++ - C++ 中 EOF 的无限循环