c++ - 如何对齐堆栈上的缓冲区?

标签 c++ gcc embedded

我正在尝试实现一个按大小对齐的内存缓冲区,以便我可以使用 DMA Controller 的模数功能来实现环形缓冲区。我知道我可以用 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() 来实现这一点,但它似乎直到 4.8 版才出现在 GCC 中。

我想一个选择可能是将缓冲区的大小加倍,但这似乎浪费了很多空间(我正计划尝试为该缓冲区使用设备内存的很大一部分)。也许我应该放弃并使用动态内存。 memalign 在空间浪费方面是否相对有效?

有什么想法吗?

最佳答案

你不需要将存储的大小加倍,你只需要添加 (alignment - 1) 到它——基本上和 memalign 后面做的一样场景。对于二次方对齐:

char buf[size + (alignment -1)];
char *aligned = (char*)((intptr_t)buf + (alignment - 1) & ~intptr_t(alignment - 1));

关于c++ - 如何对齐堆栈上的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663911/

相关文章:

c++ - 使用 'new'创建实例后出现堆栈溢出错误

c++ - 静态函数作为类模板参数 - 导致可维护性问题

c++ - 是否允许在 constexpr 函数中进行函数指针比较?

c++ - GCC --gc-sections 和寻找符号依赖

使用 gcc 编译 C 程序

c - 为什么 gcc4 不展开这个循环?

C++ 如何从标准输入加载到最多 5 个字母数字字符的字符数组?

linux - 如何执行 x86 计算机的硬件重置?

Lua 共存于裸机嵌入式 c 应用程序中

c - 什么(最小)C 图形库提供这些功能