任何人都可以告诉我如何将16位内存地址与C中的nearst 2kB地址边界对齐吗?
答案 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,这个问题是针对嵌入式系统的,也许他想在运行时动态调整地址,而不是在编译时。