c-std :: aligned_storage如何为任何对象公开正确对齐的存储?

std :: aligned_storage结构提供的typedef类型至少与cppreference相符:

Provides the member typedef type, which is a PODType suitable for use
as uninitialized storage for any object whose size is at most Len and
whose alignment requirement is a divisor of Align.

The default value of Align is the most stringent (the largest)
alignment requirement for any object whose size is at most Len.

特别是,使用默认值Align时,适合大小最大为Len的任何对象.

请注意,对于过度对齐的类型(在任何情况下,我正在使用的平台gcc,至少都支持某些过度对齐的类型)没有任何警告或例外.

这样的实现实际上如何工作?为了满足“任何对象”的要求,似乎可以:

>在类型T的alignof(T)< = sizeof(T)的平台上,由于大小为Len的对象可能具有最大Len的对齐方式,因此必须始终将其大致对齐到Len字节.当然,这会浪费大Len的大量内存!
>在alignof(T)可能大于sizeof(T)的平台上,我完全看不到如何实现.但是,这种类型甚至可以存在的并不是clear to me.

基于my testing,对于默认的Align值,无论len为何,gcc都始终总是对齐16.这意味着该存储不适用于任何对象,仅适用于基本对齐的对象(此平台上的alignof(max_align_t)== 16).

解决方法:

[meta.trans.other]/2,

It is implementation-defined whether any extended alignment is supported.

当他们在没有指针的大表之后指定这样的内容时,这很烦人.我刚刚将句子添加到cppreference中.

上一篇:【STM32F429的DSP教程】第30章 STM32F429复数浮点FFT(支持单精度和双精度)


下一篇:C标准:C90、C99、C11_C/C++