相关疑难解决方法(0)

reinterpret_cast创建一个简单的默认构造对象

cppreference 声明:

具有普通默认构造函数的对象可以通过reinterpret_cast在任何适当对齐的存储上使用来创建,例如在分配有的存储器上std::malloc.

这意味着以下是明确定义的代码:

struct X { int x; };
alignas(X) char buffer[sizeof(X)];    // (A)
reinterpret_cast<X*>(buffer)->x = 42; // (B)
Run Code Online (Sandbox Code Playgroud)

以下是三个问题:

  1. 这个引用是否正确?
  2. 如果是,那么X开始的生命周期是什么时候?如果在线(B),它是否被视为获取存储?如果在线(A),如果有一个分支(A)(B)有条件地构建一个X或其他一些pod,Y怎么办?
  3. 在这方面,C++ 11和C++ 1z之间有什么变化吗?

请注意,这是一个旧链接.针对这个问题,措辞发生了变化.它现在写道:

但是,与C不同,通过简单地重新解释适当对齐的存储来创建具有普通默认构造函数的对象,例如分配的内存std::malloc:placement-new是正式引入新对象并避免潜在的未定义行为所必需的.

c++ language-lawyer c++11 c++17

51
推荐指数
2
解决办法
1812
查看次数

为什么需要std :: aligned_storage?

因此,正如我未正确指出的那样,std :: aligned_storage的主要优点是它可以管理对齐.它也可以用memcpy复制.它也仅适用于POD类型.

但!

1)POD类型默认从编译器接收一些对齐,我们可以通过#pragma pack(push,1)删除对齐

2)我们可以默认使用memcpy复制POD(我们不应该为此功能做点什么)

所以我实际上无法获得我们需要std :: aligned_storage的目的?

c++ std c++11

12
推荐指数
3
解决办法
2254
查看次数

标签 统计

c++ ×2

c++11 ×2

c++17 ×1

language-lawyer ×1

std ×1