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

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

__attribute__((aligned(n))):此属性指定了指定类型的变量的最小对齐(以字节为单位)。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。

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

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

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

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

#include <iostream>int main()
{struct S1 {short f[3];};struct S2 {short f[3];} __attribute__((aligned(64)));struct S5 {short f[40];} __attribute__((aligned(64)));fprintf(stdout, "S1 size: %d, S2 size: %d, S5 size: %d\n",sizeof(struct S1), sizeof(struct S2), sizeof(struct S5)); // 6, 64, 128typedef int more_aligned_int __attribute__((aligned(16)));fprintf(stdout, "aligned: %d, %d\n", alignof(int), alignof(more_aligned_int)); // 4, 16struct S3 {more_aligned_int f;};struct S4 {int f;};fprintf(stdout, "S3 size: %d, S4 size: %d\n", sizeof(struct S3), sizeof(struct S4)); // 16, 4int arr[2] __attribute__((aligned(16))) = {1, 2};fprintf(stdout, "arr size: %d, arr aligned: %d\n", sizeof(arr), alignof(arr)); // 8, 16struct S6 {more_aligned_int f;} __attribute__((packed));fprintf(stdout, "S6 size: %d\n", sizeof(struct S6)); // 4char c __attribute__((aligned(16))) = 'a';fprintf(stdout, "c size: %d, aligned: %d\n", sizeof(c), alignof(c)); // 1, 16struct S7 {double f;} __attribute__((aligned(4)));fprintf(stdout, "S7 size: %d, algined: %d\n", sizeof(struct S7), alignof(struct S7)); // 8, 8struct S8 {double f;} __attribute__((__aligned__(32)));fprintf(stdout, "S8 size: %d, algined: %d\n", sizeof(struct S8), alignof(struct S8)); // 32, 32return 0;
}

CMakeLists.txt文件内容如下:

PROJECT(samples_cplusplus)
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)# 支持C++11
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2 -std=c11")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -g -Wall -O2 -std=c++11")INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})FILE(GLOB samples ${PROJECT_SOURCE_DIR}/*.cpp)FOREACH (sample ${samples})STRING(REGEX MATCH "[^/]+$" sample_file ${sample})STRING(REPLACE ".cpp" "" sample_basename ${sample_file})ADD_EXECUTABLE(test_${sample_basename} ${sample})TARGET_LINK_LIBRARIES(test_${sample_basename} pthread)
ENDFOREACH()

build.sh脚本内容如下:

#! /bin/bashreal_path=$(realpath $0)
dir_name=`dirname "${real_path}"`
echo "real_path: ${real_path}, dir_name: ${dir_name}"new_dir_name=${dir_name}/build
mkdir -p ${new_dir_name}
cd ${new_dir_name}
cmake ..
makecd -

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

GitHub: https://github.com/fengbingchun/Linux_Code_Test

Linux下__attribute__((aligned(n)))的使用相关推荐

  1. Linux下__attribute__((visibility (default)))的使用

    在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号.在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数.变量.模板以 ...

  2. linux内核 sp什么意思,浅析基于ARM的Linux下的系统调用的实现

    12:  tbl    .req    r8        @ syscall table pointer 13:  why    .req    r8        @ Linux syscall ...

  3. Linux内核及内核编程之五Linux下的C编程特点

    3.5 Linux下的C编程特点 3.5.1 Linux编码风格 Linux有独特的编码风格,Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的不同.在Windows程 ...

  4. SIPp工具Linux下安装

    2019独角兽企业重金招聘Python工程师标准>>> 一.SIPp介绍 SIPp是一个测试SIP协议性能的工具软件,这是一个开源软件.      它可使用INVITE和B YE建立 ...

  5. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  6. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  7. LINUX下GDB反汇编和调试

    Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数.而Windows下却是相反. 1. 基本操作指令 简单的操作数类型说明.一般有三种. (1)马上数操作数 ...

  8. Linux下触摸屏驱动程序分析

    [摘要: 本文以 linux 3.5--Exynos4412仄台,剖析 触摸屏 驱动焦点内容.Linux下触摸屏驱动(以ft5x06_ts为例)须要懂得以下学问: 1. I2C协定 2. Exynos ...

  9. 洞悉linux下的Netfilteriptables

    原网址:http://blog.chinaunix.net/uid-23069658-id-3160506.html (一)洞悉linux下的Netfilter&iptables:什么是Net ...

最新文章

  1. 常见NoSQL系统使用场景分析
  2. 第14讲:Selenium 的基本使用
  3. linux 编译报错 not a directory,Linux常见英文报错中文翻译
  4. Windows RabbitMQ 命令
  5. 一个栈桢对应着一个方法
  6. qt绘制一圈圆_Qt绘制圆
  7. 企业微信H5_网页jssdk调用 agentconfig选人选照片等案例演示
  8. 从0开始学习自动化测试框架cypress(三)特性
  9. python写一个服务_Python写一个服务
  10. 点击树形相应车型,置顶
  11. pta c语言编程答案,PTA 程序设计 单选题-期末复习
  12. 【c语言数学函数库】
  13. 软件测试常见性能问题案例分析
  14. ffmpeg 图片合成视频黑屏 不兼容问题合成MP4
  15. ftp指令及响应代码 (不能说一个不剩,只能说超详细)
  16. 《运营之光3.0》全新上市——跨越时代,自我颠覆的诚意之作
  17. “我不是不在乎钱,我只是不在乎这点钱。”
  18. 中企海外周报 | 熊猫智能公交车将登陆欧洲,中比能源携手美国S公司签订3亿元电芯供货协议...
  19. Solidity 安全:已知攻击方法和常见防御模式综合列表
  20. 苹果系统计算机常用英语,iOS开发必备英语词汇整理

热门文章

  1. 【20221220】Windows通过网线共享网络及小猫咪局域网共享
  2. linux启动流程及自定义gurb
  3. iOS代码质量要求_苹果发布 iOS amp; iPadOS 13.1 beta 4 版本;Dart 2.5正式公布;SwiftUI View的生命周期...
  4. USB口的红外条形码扫描器的另类使用 1
  5. 好听的英文歌推荐 必备(亿买网整理)
  6. SLAM大牛Cyrill 开源SuMa ++:基于语义激光雷达过滤动态物体提高定位精度
  7. 2种方法设置RAR文件打开密码
  8. 《安富莱嵌入式周报》第227期:2021.08.23--2021.08.29
  9. 【个人学习笔记】泛函分析-度量空间(一)——定义与例子
  10. 制药巨头测试IBM的区块链系统以改善临床试验