我正在尝试实现一个与其大小对齐的内存缓冲区,这样我就可以使用 DMA 控制器的模特性来实现一个环形缓冲区。我知道我可以用 memalign 做到这一点,但我想知道是否可以在堆栈上这样做,因为到目前为止我已经能够避免 dynamic memory。我使用的是 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];
};
但当然 GCC 不会接受非常量对齐(并且似乎表明对齐 > 8 可能无论如何都不会得到尊重)。
我想我可以使用 C++0x alignas() 来实现这一点,但它似乎直到 4.8 版才出现在 GCC 中。
我想一个选择可能是将缓冲区的大小加倍,但这似乎浪费了一堆空间(我计划尝试将大部分设备内存用于此缓冲区)。也许我应该放弃并使用动态内存。memalign 在浪费空间方面会相对有效吗?
有任何想法吗?