如何对齐内存地址?

时间:2015-08-31 10:36:18

标签: c embedded

任何人都可以告诉我如何将16位内存地址与C中的nearst 2kB地址边界对齐吗?

3 个答案:

答案 0 :(得分:2)

在C11中,您可以分配动态内存并指定与函数aligned_alloc的对齐方式。您也可以使用C11 _Alignas说明符。

大多数编译器还具有指定对齐的扩展名,例如gcc具有aligned属性。来自documentation

  

对齐(对齐)

     

此属性指定变量或结构字段的最小对齐方式,以字节为单位。例如,声明:

     int x __attribute__ ((aligned (16))) = 0;

答案 1 :(得分:2)

您可以使用aligned_alloc分配对齐的内存块。如果要对齐局部变量,可以使用编译器属性。在GCC中,它是aligned

例如:

 int x __attribute__ ((aligned (16))) = 0;

对于Visual C ++,它也是aligned

例如:

__declspec(align(16)) struct Str1{
   int a, b, c, d, e;
};

答案 2 :(得分:1)

如果你想自己做,或者你需要动态分配/地址,你可以使用以下简单的计算:

Aligned2kBoundary = (Unaligned + 2047) & ~(2047);

如果bound是您的边界值,则采用更通用的形式:

Aligned2kBoundary = (Unaligned + bound -1) & ~(bound-1);

警告:仅适用于权力为2的边界!

对于谁没有注意到它的PS,这个问题是针对嵌入式系统的,也许他想在运行时动态调整地址,而不是在编译时。