gcc 中的__attribute__ ((packed)) gcc移植,内存对齐.结构体对齐-转
__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移植,内存对齐.结构体对齐-转相关推荐
- __attribute__((__aligned__(n)))对结构体对齐的影响
1. __attribute__ 是什么? __attribute__是GCC里的编译参数,用法有很多种,感兴趣可以阅读一下gcc的相关文档.这里说一下__attribute__对变量和结构体对齐的影 ...
- Keil中取消结构体对齐的方法
Keil中取消结构体对齐的方法 我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下. union {uint ...
- 使用gcc中的__attribute__指定字节对齐
在x86(32位机器)平台下,GCC编译器默认按4字节对齐: 如:结构体4字节对齐,即结构体成员变量所在的内存地址是4的整数倍. 可以通过使用gcc中的_attribute_选项来设置指定的对齐大小 ...
- linux gcc中sin30度,学习gcc.pdf
学习gcc 如何在 Ubuntu 下安装和使用 gcc GCC 是在Linux 系统中用的比较多的编译器,一般做Linux 开发的朋友都会用 GCC 编译器,但今天 在 Ubuntu 上安装 GCC ...
- C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 ( (struct X*)0 ) -> Y)语法(匿名结构体)
示例: typedef struct _user {char name[20];char sex[20];int age;struct list_head mylist;//自定义结构体里保存双向循环 ...
- Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析
一:struct和union的区别 struct,相互关联的元素的集合,每个元素都有自己的内存空间:每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序:一个struct所占的总的内存大小,并不是 ...
- 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...
- c语言共享内存储存结构体,C语言共享内存使用思路利用结构体
这里不介绍如何创建共享内存,如果想知道百度一下就好了.只介绍一下如何使用这一段连续的共享内存空间.思路就是利用结构体. 创建一个结构体,它的大小可以用sizeof()获取.注意这里有一个四字节对齐的问 ...
- c语言怎么往结构体中传数据,怎么把文件数据写入结构体 c语言 怎么将结构体写入文件...
怎么把结构体的数据写到文件中 C语言把一个结构体数组写入文件分三步: 以二进制写方式(wb)打开文件 调用写入函数fwrite()将结构体数据写入文件 关闭文件指针 相应的,读文件也要与之匹配: 以二 ...
最新文章
- OMG!Semaphore里面居然有这么一个大坑!
- linux epoll 文件,Linux面试必知:一句话讲透epoll-文件句柄
- EL之RF(随机性的Bagging+DTR):利用随机选择属性的bagging方法解决回归(对多变量的数据集+实数值评分预测)问题
- 算法解读--递归(二)
- json里面的list数据取不出来_[工具]用kaggle API下载数据集
- 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
- eclipse和mysql创建ssm_Eclipse下SSM项目的搭建
- python随机猜数字游戏_Python小游戏——猜数字教程(random库教程)
- AMD 证实停止向中国提供 x86 新技术授权!
- Live2D在Unity中的使用
- 2018年10微型计算机接口技术,微机原理及接口技术
- SPI通信协议技术说明文档
- OSChina 周五乱弹 —— 毁人不倦的大师们
- gabor filters matlab,matlab实现gabor filter (1)
- 使用讯飞语音识别的空指针错误
- 半年亏损超5亿美元/股价腰斩,这家自动驾驶公司日子不好过
- 头像制作抖音微信壁纸小程序搭建一个基于uniCloud阿里OSS对象存储的免费图床源码
- 2017年下半年小虎软考备考攻略
- python基础 多点坐标 绘制折线图 计算两点距离
- 嵌入式linux华清远见考试,嵌入式Linux小测及答案