arrays - C:定义具有 64 位对齐起始地址的数组的可移植方法?

标签 arrays c alignment c89

对于在各种/未知架构/编译器(8/16/32/64 位)上编译的代码,必须定义全局内存池数组:

uint8_t mempool[SIZE];

该内存池用于存储不同结构类型的对象,例如:

typedef struct Meta_t {
  uint16_t size;
  struct Meta_t *next;
  //and more
}

由于结构对象始终必须与最大可能的边界对齐,例如64 字节,必须确保在 mempool 内的那些结构对象之间添加填充字节:

struct Meta_t* obj = (struct Meta_t*) mempool[123] + padding;

这意味着如果结构对象从未对齐的地址开始,则对此的访问将导致对齐陷阱。

这在我的代码中已经很好地工作了。但我仍在寻找一种可移植的方法来对齐内存池起始地址。因为如果没有这个,就必须在数组起始地址和内存池内第一个结构的地址之间插入填充字节。

到目前为止,我发现的唯一方法是在 union 内定义内存池以及无论如何都会由编译器对齐的另一个变量,但这应该是不可移植的。

不幸的是,对于嵌入式平台,我的代码也是使用 ANSI C90 编译器编译的。事实上,我无法猜测到底使用了什么编译器。因此,我正在寻找一个绝对可移植的解决方案,我猜想 C90 之后添加的任何类型的预处理器指令或编译器特定属性或语言功能都无法使用

最佳答案

您可以使用_Alignas,它是 C11 standard 的一部分,强制进行特定对齐。

_Alignas(uint64_t) uint8_t mempool[SIZE];

关于arrays - C:定义具有 64 位对齐起始地址的数组的可移植方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72815853/

相关文章:

c - 通常使用大小为 4 的未初始化值

c - 为什么 char * 和 char ** 的值相同?

html - 在页面宽度上水平对齐 <li>

Java 面板对齐

arrays - 将元胞矩阵转换为单行向量?

Javascript .reduce() 没有按预期运行?

ios - 根据 Swift iOS 中的大小对文档目录中的文件和文件夹进行排序

JavaScript - 数组 - 更改一个元素但为什么整个列都改变了?

c - 打印指针值时出现段错误

html - HTML 中的内联 SVG 对齐