在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()
。
当我运行它时,它似乎工作,但我不确定这是否真的保存。
我查看了其他示例(例如,here、here和其他示例),但他们总是使用T
而不是T[]
作为示例。
2条答案
按热度按时间o0lyfsai1#
您不需要执行任何不同的操作。根据[expr.alignof]/3,
T[N]
的对齐方式就是T
的对齐方式,因此您可以使用您也可以只使用数组本身的对齐方式和大小,如
uubf1zoe2#
我们有
std::aligned_storage_t<sizeof(T), alignof(T)> data_[SIZE]
,文档建议用数组替换对齐的存储,这样就得到了一个多维数组:访问该数组的方式应该与访问之前的aligned_storage数组的方式大致相同。
您也可以将其设置为一维数组
alignas(T) std::byte data_[SIZE*sizeof(T)]
,但没有太大的好处(正如您所提到的,您需要&data_[i*sizeof(V)]
来获取指向第i个元素的指针,而对于多维数组,您可以使用data_[i]
)