__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

#define __u8    unsigned char
#define __u16   unsigned short

/* __attribute__ ((packed)) 的位置约束是放于声明的尾部“;”之前 */
struct str_struct{
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
} __attribute__ ((packed));

/*  当用到typedef时,要特别注意__attribute__ ((packed))放置的位置,相当于:
  *  typedef struct str_stuct str;
  *  而struct str_struct 就是上面的那个结构。
  */
typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
} __attribute__ ((packed)) str;

/* 在下面这个typedef结构中,__attribute__ ((packed))放在结构名str_temp之后,其作用是被忽略的,注意与结构str的区别。*/
typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
}str_temp __attribute__ ((packed));

typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
}str_nopacked;

int main(void)
{
        printf("sizeof str_struct   = %d/n", sizeof(struct str_struct));
        printf("sizeof str          = %d/n", sizeof(str));
        printf("sizeof str_temp      = %d/n", sizeof(str_temp));
        printf("sizeof str_nopacked = %d/n", sizeof(str_nopacked));
        return 0;
}

编译运行:
[root@localhost root]# ./packedtest   
sizeof str_struct   = 5 
sizeof str          = 5
sizeof str_temp      = 6
sizeof str_nopacked = 6

--------------------------------------------------------------------
GNU C的一大特色就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
__attribute__书写特征是:__attribute__前后都有两个下划线,并且后面会紧跟一对括弧,括弧里面是相应的__attribute__参数。
__attribute__语法格式为:

__attribute__ ((attribute-list))

其位置约束:放于声明的尾部“;”之前。

函数属性(Function Attribute):函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。

GNU CC需要使用 –Wall编译器来击活该功能,这是控制警告信息的一个很好的方式。

packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。

//--补充

今天移植usb驱动到uboot中,就发现这个问题。在ads1.2中用__packed修饰的,我一开始把它去掉了。搞了2天没搞出来。后来才发现是这个问题。

gcc 中的__attribute__ ((packed)) gcc移植,内存对齐.结构体对齐-转相关推荐

  1. __attribute__((__aligned__(n)))对结构体对齐的影响

    1. __attribute__ 是什么? __attribute__是GCC里的编译参数,用法有很多种,感兴趣可以阅读一下gcc的相关文档.这里说一下__attribute__对变量和结构体对齐的影 ...

  2. Keil中取消结构体对齐的方法

    Keil中取消结构体对齐的方法 我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下. union {uint ...

  3. 使用gcc中的__attribute__指定字节对齐

    在x86(32位机器)平台下,GCC编译器默认按4字节对齐: 如:结构体4字节对齐,即结构体成员变量所在的内存地址是4的整数倍. 可以通过使用gcc中的_attribute_选项来设置指定的对齐大小 ...

  4. linux gcc中sin30度,学习gcc.pdf

    学习gcc 如何在 Ubuntu 下安装和使用 gcc GCC 是在Linux 系统中用的比较多的编译器,一般做Linux 开发的朋友都会用 GCC 编译器,但今天 在 Ubuntu 上安装 GCC ...

  5. C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 ( (struct X*)0 ) -> Y)语法(匿名结构体)

    示例: typedef struct _user {char name[20];char sex[20];int age;struct list_head mylist;//自定义结构体里保存双向循环 ...

  6. Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析

    一:struct和union的区别 struct,相互关联的元素的集合,每个元素都有自己的内存空间:每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序:一个struct所占的总的内存大小,并不是 ...

  7. 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )

    文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...

  8. c语言共享内存储存结构体,C语言共享内存使用思路利用结构体

    这里不介绍如何创建共享内存,如果想知道百度一下就好了.只介绍一下如何使用这一段连续的共享内存空间.思路就是利用结构体. 创建一个结构体,它的大小可以用sizeof()获取.注意这里有一个四字节对齐的问 ...

  9. c语言怎么往结构体中传数据,怎么把文件数据写入结构体 c语言 怎么将结构体写入文件...

    怎么把结构体的数据写到文件中 C语言把一个结构体数组写入文件分三步: 以二进制写方式(wb)打开文件 调用写入函数fwrite()将结构体数据写入文件 关闭文件指针 相应的,读文件也要与之匹配: 以二 ...

最新文章

  1. OMG!Semaphore里面居然有这么一个大坑!
  2. linux epoll 文件,Linux面试必知:一句话讲透epoll-文件句柄
  3. EL之RF(随机性的Bagging+DTR):利用随机选择属性的bagging方法解决回归(对多变量的数据集+实数值评分预测)问题
  4. 算法解读--递归(二)
  5. json里面的list数据取不出来_[工具]用kaggle API下载数据集
  6. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
  7. eclipse和mysql创建ssm_Eclipse下SSM项目的搭建
  8. python随机猜数字游戏_Python小游戏——猜数字教程(random库教程)
  9. AMD 证实停止向中国提供 x86 新技术授权!
  10. Live2D在Unity中的使用
  11. 2018年10微型计算机接口技术,微机原理及接口技术
  12. SPI通信协议技术说明文档
  13. OSChina 周五乱弹 —— 毁人不倦的大师们
  14. gabor filters matlab,matlab实现gabor filter (1)
  15. 使用讯飞语音识别的空指针错误
  16. 半年亏损超5亿美元/股价腰斩,这家自动驾驶公司日子不好过
  17. 头像制作抖音微信壁纸小程序搭建一个基于uniCloud阿里OSS对象存储的免费图床源码
  18. 2017年下半年小虎软考备考攻略
  19. python基础 多点坐标 绘制折线图 计算两点距离
  20. 嵌入式linux华清远见考试,嵌入式Linux小测及答案

热门文章

  1. xcode工程间的引用,iOS静态库
  2. Android开发学习之ImageView手势拖拽、缩放、旋转
  3. B - Cube HDU - 1220 (数学计数)
  4. BZOJ2653middle——二分答案+可持久化线段树
  5. 3月19日学习内容整理:redis
  6. 实用的 PHP 正则表达式
  7. 【转】两个算法题,感觉挺有意思
  8. Reddit 评级算法的工作原理
  9. 为什么Hadoop将一定会是分布式计算的未来?
  10. 史上最大规模的 PPS DDoS 攻击现身,欧洲某大型银行遭殃