pack与aligned的区别

GCC支持用__attribute__为变量、类型、函数以及标签指定特殊属性。其中可以使用attribute的aligned属性控制变量或类型的内存对其规则,之前一篇文章已经提到pack可以改变结构体中各成员之间的内存对其规则。https://langzi989.github.io/2017/10/02/C语言内存对其相关/

其中#pragma pack()和__attribute__((aligned))区别很大。

aligned内存对其详解

使用场景:

  • 变量
  • 类型

功能说明:

  • 当aligned作用于变量时,其作用是告诉编译器为变量分配内存的时候,要分配在指定对齐的内存上.作用于变量之上不会改变变量的大小。

    • 例如:int a __attribute__((aligned(16)));该变量a的内存起始地址为16的倍数。
  • 当aligned作用于类型时,其作用是告诉编译器该类型声明的所有变量都要分配在指定对齐的内存上。当该属性作用于结构体声明时可能会改变结构体的大小。
struct Test{char a[3];
}__attribute__((aligned(8)));int main() {//8std::cout << sizeof(Test);
}

如上所示,当align作用于结构体定义时会改变结构体的大小。结构体最终大小为aligned指定大小的整数倍。

aligned与pack的区别

从上面可以看出,aligned和pack的主要区别如下:

  • pack作用于结构体或类的定义,而aligned既可以作用于结构体或类的定义,也可以作用于变量的声明。
  • pack的作用是改变结构体或类中成员变量的布局规则,而aligned只是建议编译器对指定变量或指定类型的变量分配内存时的规则。
  • pack可以压缩变量所占内存的空间
  • align可以指定变量在内存的对其规则,而pack不可以。
  • 若某一个结构体的默认pack为n,pack指定的对齐规则m大于n,则该pack忽略。若aligned指定的对齐规则s大于n,则此时结构体的大小一定为s的整数倍。
  • aligned和pack指定规则时都必须为2的n次幂。
  • pack作用于结构体内部的成员变量,而align作用于结构体分配地址的内存对其规则
  • pack 与align都可能改变结构体的大小

其他

__attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法,这个功能是跟操作系统没关系,跟编译器有关。
使用该属性,被修饰的类型在分配内存的时候将被分配为紧凑模式。
如:

struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];
};

参考链接:http://blog.shengbin.me/posts/gcc-attribute-aligned-and-packed

pack与aligned的区别相关推荐

  1. c语言中定义的数组按照指定字节对齐

    最近在调试一个简单的网卡裸板收发包demo,组包和拆包时,需要使用dma,而我所使用的处理器的dma是128bit对齐的,因此,在使用dma时,需要保证16字节对齐.采用的对齐方式如下: #pragm ...

  2. 【latex】Package amsmath Error: Erroneous nesting of equation structures

    错误: Package amsmath Error: Erroneous nesting of equation structures;(amsmath) trying to recover with ...

  3. 05 C语言框架讲解(嵌入式C语言要学哪些内容,学习路线)

    C语言框架讲解(C语言要学哪些内容,学习路线) b站配套视频地址 CSDN有图阅读地址 Gitee文档源码地址 作者 将狼才鲸 日期 2021-07-17 注:gitee暂不支持markdown me ...

  4. #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别

    from:http://blog.csdn.net/mylinx/article/details/7007309 #pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认&quo ...

  5. #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别

    #pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4, ...

  6. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

    转自:https://www.cnblogs.com/ransn/p/5081198.html 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自 ...

  7. Solidworks装配体打包/Pack and Go和另存为两种方法的区别

    Solidworks装配体打包/Pack and Go和另存为两种方法的区别 1. 打包/Pack and Go 2. 另存为(推荐) 1. 打包/Pack and Go 优点:不但可以将零件打包,还 ...

  8. #pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  9. #pragma pack(push,1)与#pragma pack(1)的区别(转)

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

最新文章

  1. 直接运行可执行文件linux终端一闪而过
  2. java 不知道类名_Java 中获取类名的三种方法,你知道几种?
  3. 使用 vue + thinkjs 开发博客程序记录
  4. samtools idxstats
  5. Netflix:我们是如何评估Codec性能的?
  6. java虚拟内存扩展_Java 8虚拟扩展方法
  7. oracle10g-创建表空间 用户
  8. Java——n个数的全排列
  9. jpa mysql脚本迁移_JPA通过LOAD DATA LOCAL INFILE大批量导入数据到MySQL
  10. .net core 获取机器码_.NET Core 反射获取所有控制器及方法上特定标签
  11. java输入一串字符串反转_反转Java中的字符串
  12. easymock接口模拟_EasyMock模拟异常
  13. iPhone开发入门(一)
  14. watchOS7.2新增“心适能功能” 监测和分类心肺适能水平
  15. HTML制作课表源代码
  16. 如何写好一份数据分析报告
  17. 微信扫码下载APK解决方案
  18. Java实现PDF打印的解决方案
  19. IntellijIdea2018 Liscense server激活码
  20. .NET ASP.NET 页生命周期概述

热门文章

  1. linux停止阿里云盾服务
  2. 你沐浴后的味道,根本让人把持不住!留香24小时,比喷了大牌香水还迷人!...
  3. 大学学计算机专业高中怎样选课,高中选课大学对应专业 选什么科目能学的专业多...
  4. 如何把照片制作成带音乐的影集相册?动感特效,简单实用!
  5. HTML+CSS实现动态效果相册
  6. 已解决Pandas requires version ‘1.4.0‘ or newer of ‘sqlalchemy‘ (version ‘0.7.10‘ currently installed).
  7. 共线方程求解外方位元素--单片空间后方交会
  8. eclipse中如何把中文变成英文?
  9. LeetCode刷题——剑指offer深度优先搜索题目汇总
  10. php虚线_实现css虚线样式的两种方式:dotted和dashed(实例)