我正在尝试实现一个与其大小对齐的内存缓冲区,以便我可以使用DMA控制器的模数功能来实现环形缓冲区.我知道我可以用memalign做到这一点,但我想知道它是否可能在堆栈上这样做,因为到目前为止我已经能够避免动态内存.我正在使用GCC 4.4.1,我不关心可移植性(嵌入式系统).
我想做的事情如下:
template<uint16_t num_channels, uint16_t buffer_size>
class sampler {
__attribute__((aligned(buffer_size * num_channels * 2)))
uint16_t buffer[buffer_size][num_channels];
};
Run Code Online (Sandbox Code Playgroud)
但是GCC当然不接受非恒定对齐(并且似乎表明对齐> 8可能无法兑现).
我想我可以使用C++ 0x alignas()来实现这一点,但它似乎在版本4.8之前没有出现在GCC中.
我想一个选项可能是将缓冲区的大小加倍,但这似乎浪费了一大堆空间(我打算尝试将大部分设备内存用于此缓冲区).也许我应该放弃并使用动态内存.在浪费的空间方面,memalign会相对有效吗?
有任何想法吗?
您不需要将存储大小加倍,您只需要添加(alignment - 1)它 - 基本上与memalign幕后操作相同.对于两个对齐的力量:
char buf[size + (alignment -1)];
char *aligned = (char*)((intptr_t)buf + (alignment - 1) & ~intptr_t(alignment - 1));
Run Code Online (Sandbox Code Playgroud)