我希望实现一个按大小对齐的内存缓冲区,以便我可以使用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];
};
当然,GCC不接受非常量对齐方式(而且似乎表明大于8的对齐方式可能无法得到遵守)。
我认为我可以使用C++0x的alignas()来实现这一点,但在GCC版本4.8之前似乎没有出现过它。
我猜一个选项可能是将缓冲区的大小加倍,但那似乎会浪费很多空间(我计划尝试利用设备内存的大部分空间来存储这个缓冲区)。也许我应该放弃并使用动态内存。使用memalign会在浪费空间方面相对有效吗?
有什么想法吗?