对齐特性(C11)

作者:追风剑情 发布于:2020-4-14 9:45 分类:C

size_t d_align = _Alignof(float);
假设d_align的值是4,意思是float类型对象的对齐要求是4。也就是说,4是储存该类型值相邻地址的字节数。一般而言,对齐值都应该是2的非负整数次幂。较大的对齐值被称为stricter或stronger,较小的对齐值被称为weaker。

可以使用_Alignas说明符指定一个变量或类型的对齐值。但是,不应该要求该值小于基本对齐值。
例如,如果float类型的对齐要求是4,不要请求其对齐值是1或2
_Alignas(double) char cl;
_Alignas(8) char c2;
unsigned char _Alignas(long double) c_arr[sizeof(long double)];

C11在stdlib.h库还添加了一个新的内存分配函数,用于对齐动态分配的内存。该函数原型如下:
void *aligned_alloc(size_t alignment, size_t size);
第1个参数代表指定的对齐,第2个参数是所需的字节数,其值应是第1个参数的倍数。与其他内存分配函数一样,要使用free()函数释放之前分配的内存。

示例

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. //提供CHAR_BIT的定义,CHAR_BIT表示每字节的位数
  6. #include <limits.h>
  7. //C99定义了bool、true、false
  8. #include <stdbool.h>
  9. //引入alignas和alignof分别作为_Alignas和_Alignof的别名。这样做可以与C++关键字匹配 (C11特性)
  10. #include <stdalign.h>
  11.  
  12. int main(int argc, char* argv[])
  13. {
  14. /* -- 使用_Alignof和_Alignas (C11) -- */
  15. double dx;
  16. char ca;
  17. char cx;
  18. double dz;
  19. char cb;
  20. char _Alignas(double) cz;
  21.  
  22. printf("char alignment: %zd\n", _Alignof(char));
  23. printf("double alignment: %zd\n", _Alignof(double));
  24. printf("&dx: %p\n", &dx);
  25. printf("&ca: %p\n", &ca);
  26. printf("&cx: %p\n", &cx);
  27. printf("&dz: %p\n", &dz);
  28. printf("&cb: %p\n", &cb);
  29. printf("&cz: %p\n", &cz);
  30.  
  31. system("pause");
  32. return 0;
  33. }

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号