Linux下__attribute__((aligned(n)))的使用
关键字__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)))的使用相关推荐
- Linux下__attribute__((visibility (default)))的使用
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号.在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数.变量.模板以 ...
- linux内核 sp什么意思,浅析基于ARM的Linux下的系统调用的实现
12: tbl .req r8 @ syscall table pointer 13: why .req r8 @ Linux syscall ...
- Linux内核及内核编程之五Linux下的C编程特点
3.5 Linux下的C编程特点 3.5.1 Linux编码风格 Linux有独特的编码风格,Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的不同.在Windows程 ...
- SIPp工具Linux下安装
2019独角兽企业重金招聘Python工程师标准>>> 一.SIPp介绍 SIPp是一个测试SIP协议性能的工具软件,这是一个开源软件. 它可使用INVITE和B YE建立 ...
- Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...
- Linux下的静态链接库和动态链接库编程
Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...
- LINUX下GDB反汇编和调试
Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数.而Windows下却是相反. 1. 基本操作指令 简单的操作数类型说明.一般有三种. (1)马上数操作数 ...
- Linux下触摸屏驱动程序分析
[摘要: 本文以 linux 3.5--Exynos4412仄台,剖析 触摸屏 驱动焦点内容.Linux下触摸屏驱动(以ft5x06_ts为例)须要懂得以下学问: 1. I2C协定 2. Exynos ...
- 洞悉linux下的Netfilteriptables
原网址:http://blog.chinaunix.net/uid-23069658-id-3160506.html (一)洞悉linux下的Netfilter&iptables:什么是Net ...
最新文章
- 常见NoSQL系统使用场景分析
- 第14讲:Selenium 的基本使用
- linux 编译报错 not a directory,Linux常见英文报错中文翻译
- Windows RabbitMQ 命令
- 一个栈桢对应着一个方法
- qt绘制一圈圆_Qt绘制圆
- 企业微信H5_网页jssdk调用 agentconfig选人选照片等案例演示
- 从0开始学习自动化测试框架cypress(三)特性
- python写一个服务_Python写一个服务
- 点击树形相应车型,置顶
- pta c语言编程答案,PTA 程序设计 单选题-期末复习
- 【c语言数学函数库】
- 软件测试常见性能问题案例分析
- ffmpeg 图片合成视频黑屏 不兼容问题合成MP4
- ftp指令及响应代码 (不能说一个不剩,只能说超详细)
- 《运营之光3.0》全新上市——跨越时代,自我颠覆的诚意之作
- “我不是不在乎钱,我只是不在乎这点钱。”
- 中企海外周报 | 熊猫智能公交车将登陆欧洲,中比能源携手美国S公司签订3亿元电芯供货协议...
- Solidity 安全:已知攻击方法和常见防御模式综合列表
- 苹果系统计算机常用英语,iOS开发必备英语词汇整理
热门文章
- 【20221220】Windows通过网线共享网络及小猫咪局域网共享
- linux启动流程及自定义gurb
- iOS代码质量要求_苹果发布 iOS amp; iPadOS 13.1 beta 4 版本;Dart 2.5正式公布;SwiftUI View的生命周期...
- USB口的红外条形码扫描器的另类使用 1
- 好听的英文歌推荐 必备(亿买网整理)
- SLAM大牛Cyrill 开源SuMa ++:基于语义激光雷达过滤动态物体提高定位精度
- 2种方法设置RAR文件打开密码
- 《安富莱嵌入式周报》第227期:2021.08.23--2021.08.29
- 【个人学习笔记】泛函分析-度量空间(一)——定义与例子
- 制药巨头测试IBM的区块链系统以改善临床试验