【发布时间】:2019-10-08 23:06:21
【问题描述】:
C++17 引入了一个新类型std::byte,所以现在我们终于有了一个一等公民类型来表示内存中的字节。除了作为标准中的新事物之外,对象创建、生命的开始和结束、别名等的 C++ 规则在大多数情况下都相当复杂且不直观,所以每当我觉得 std::byte 是正确的工具时,我也会感到紧张和不愿意使用它,因为害怕无意中召唤了未定行为炎魔。
一个这样的情况是用于放置新的缓冲区:
#include <memory>
#include <cstddef>
#include <type_traits>
struct X { double dummy[4]; char c; };
auto t1()
{
// the old way
std::aligned_storage_t<sizeof(X)> buffer;
X* x = new (&buffer) X{};
x->~X();
}
auto t2()
{
// the new way?
std::byte buffer[sizeof(X)];
X* x = new (&buffer) X{};
x->~X();
}
t2 是否完全安全且等同于 t1?
针对对齐问题,如何处理:
auto t3()
{
alignas(X) std::byte buffer[sizeof(X)];
X* x = new (&buffer) X{};
x->~X();
}
【问题讨论】:
标签: c++ byte language-lawyer c++17