相关疑难解决方法(0)

std::byte 可以代替 std::aligned_storage 吗?

C++17 引入了一种新类型 ,std::byte所以现在我们终于有了一个一等公民类型来表示内存中的字节。除了标准中的新奇之外,对象创建、生命的开始和结束、别名等的 C++ 规则在大多数情况下都相当复杂且不直观,所以每当我觉得std::byte是正确的工具时,我也会感到紧张和不愿使用它,因为害怕无意中召唤出未定义行为炎魔。

一种这样的情况是用于放置 new 的缓冲区:

#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();
}
Run Code Online (Sandbox Code Playgroud)

t2完全安全和等效的t1?

针对对齐问题,如何处理:

auto t3()
{
    alignas(X) std::byte buffer[sizeof(X)];

    X* x = new (&buffer) X{};
    x->~X();
}
Run Code Online (Sandbox Code Playgroud)

c++ byte language-lawyer c++17

3
推荐指数
2
解决办法
638
查看次数

标签 统计

byte ×1

c++ ×1

c++17 ×1

language-lawyer ×1