c++ 如何将aligned_storage〈T[]>替换为std::byte[]?

mgdq6dx1  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(171)

在C ++23中不推荐使用aligned_storage,建议用对齐的std::byte[]代替(参见here)。

    • 1.如何对齐?**

文件建议替换
std::aligned_storage_t<sizeof(T), alignof(T)> t_buff;
alignas(T) std::byte t_buff[sizeof(T)].
但是,我实际上存储的是一个T的数组(或者T是一个数组)。
一米五米
我认为这是一个错误的用法alignas或没有?

    • 2.如何读/写?**

我认为访问权限没有太大变化,所以阅读时使用以下语句是否正确:

reference data(size_t index) noexcept {
    return *std::launder(reinterpret_cast<T*>(&data_[index*sizeof(T)]));
}

并写入
一米七三
"我为什么要问"
我对alignas的使用似乎真的错了,我应该如何对齐它?我真的可以用sizeof(T)乘访问索引吗?还是我需要考虑填充?如何?
此外,代码似乎比以前更糟糕,因为我必须在任何地方插入sizeof()
当我运行它时,它似乎工作,但我不确定这是否真的保存。
我查看了其他示例(例如,herehere和其他示例),但他们总是使用T而不是T[]作为示例。

o0lyfsai

o0lyfsai1#

您不需要执行任何不同的操作。根据[expr.alignof]/3,T[N]的对齐方式就是T的对齐方式,因此您可以使用

alignas(T) std::byte data_[sizeof(T) * SIZE];

您也可以只使用数组本身的对齐方式和大小,如

alignas(T[SIZE]) std::byte t_buff[sizeof(T[SIZE])]
uubf1zoe

uubf1zoe2#

我们有std::aligned_storage_t<sizeof(T), alignof(T)> data_[SIZE],文档建议用数组替换对齐的存储,这样就得到了一个多维数组:

alignas(T) std::byte data_[SIZE][sizeof(T)];

访问该数组的方式应该与访问之前的aligned_storage数组的方式大致相同。
您也可以将其设置为一维数组alignas(T) std::byte data_[SIZE*sizeof(T)],但没有太大的好处(正如您所提到的,您需要&data_[i*sizeof(V)]来获取指向第i个元素的指针,而对于多维数组,您可以使用data_[i]

相关问题