Linux下__attribute__((aligned(n)))的使用

Linux下__attribute__((aligned(n)))的使用

2018年07月31日 22:01:46 fengbingchun 阅读数:1365

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengbingchun/article/details/81321419

关键字__attribute__允许你在定义struct、union、变量等类型时指定特殊属性。此关键字后面是跟着双括号括起来的属性说明。__attribute__不属于标准C语言,它是GCC对C语言的一个扩展用法。

你可以在其关键字之前和之后使用"__"指定这些属性中的一个,这样允许你在头文件中使用这些属性,而不必担心可能的同名宏。例如你可以使用__aligned__代替aligned。

        __attribute__((aligned(n))):此属性指定了指定类型的变量的最小对齐(以字节为单位)。如果结构中有成员的长度大于n(意思是如果结构体中的元素中最大齐字节数小于等于n,譬如n=4,结构体元素中最大是int a;(4字节对齐)则变量的对齐就是按照4字节对齐,),则按照最大成员的长度来对齐。如果n大于最大的元素的字节数4,则变量的对齐就按照n的值对齐。

注意:对齐属性的有效性会受到链接器(linker)固有限制的限制,即如果你的链接器仅仅支持8字节对齐,即使你指定16字节对齐,那么它也仅仅提供8字节对齐。

 __attribute__((packed)):此属性取消在编译过程中的优化对齐。

关于C++内存对齐介绍可以参考: https://blog.csdn.net/fengbingchun/article/details/81270326

 以下是测试代码(sample_attribute_aligned.cpp):

 
  1. #include <iostream>

  2.  
  3. int main()

  4. {

  5. struct S1 {short f[3];};

  6. struct S2 {short f[3];} __attribute__((aligned(64)));

  7. struct S5 {short f[40];} __attribute__((aligned(64)));

  8. fprintf(stdout, "S1 size: %d, S2 size: %d, S5 size: %d\n",

  9. sizeof(struct S1), sizeof(struct S2), sizeof(struct S5)); // 6, 64, 128

  10.  
  11. typedef int more_aligned_int __attribute__((aligned(16)));

  12. fprintf(stdout, "aligned: %d, %d\n", alignof(int), alignof(more_aligned_int)); // 4, 16

  13.  
  14. struct S3 {more_aligned_int f;};

  15. struct S4 {int f;};

  16. fprintf(stdout, "S3 size: %d, S4 size: %d\n", sizeof(struct S3), sizeof(struct S4)); // 16, 4

  17.  
  18. int arr[2] __attribute__((aligned(16))) = {1, 2};

  19. fprintf(stdout, "arr size: %d, arr aligned: %d\n", sizeof(arr), alignof(arr)); // 8, 16

  20.  
  21. struct S6 {more_aligned_int f;} __attribute__((packed));

  22. fprintf(stdout, "S6 size: %d\n", sizeof(struct S6)); // 4

  23.  
  24. char c __attribute__((aligned(16))) = 'a';

  25. fprintf(stdout, "c size: %d, aligned: %d\n", sizeof(c), alignof(c)); // 1, 16

  26.  
  27. struct S7 {double f;} __attribute__((aligned(4)));

  28. fprintf(stdout, "S7 size: %d, algined: %d\n", sizeof(struct S7), alignof(struct S7)); // 8, 8

  29.  
  30. struct S8 {double f;} __attribute__((__aligned__(32)));

  31. fprintf(stdout, "S8 size: %d, algined: %d\n", sizeof(struct S8), alignof(struct S8)); // 32, 32

  32.  
  33. return 0;

  34. }

CMakeLists.txt文件内容如下:

 
  1. PROJECT(samples_cplusplus)

  2. CMAKE_MINIMUM_REQUIRED(VERSION 3.0)

  3.  
  4. # 支持C++11

  5. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2 -std=c11")

  6. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2 -std=c++11")

  7.  
  8. INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})

  9.  
  10. FILE(GLOB samples ${PROJECT_SOURCE_DIR}/*.cpp)

  11.  
  12. FOREACH (sample ${samples})

  13. STRING(REGEX MATCH "[^/]+$" sample_file ${sample})

  14. STRING(REPLACE ".cpp" "" sample_basename ${sample_file})

  15. ADD_EXECUTABLE(test_${sample_basename} ${sample})

  16. TARGET_LINK_LIBRARIES(test_${sample_basename} pthread)

  17. ENDFOREACH()

  18.  

build.sh脚本内容如下:

 
  1. #! /bin/bash

  2.  
  3. real_path=$(realpath $0)

  4. dir_name=`dirname "${real_path}"`

  5. echo "real_path: ${real_path}, dir_name: ${dir_name}"

  6.  
  7. new_dir_name=${dir_name}/build

  8. mkdir -p ${new_dir_name}

  9. cd ${new_dir_name}

  10. cmake ..

  11. make

  12.  
  13. cd -

编译及测试方法如下:首先执行build.sh,然后再执行./build/test_sample_attribute_aligned即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值