Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析
一:struct和union的区别
struct,相互关联的元素的集合,每个元素都有自己的内存空间;每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序;一个struct所占的总的内存大小,并不是各个元素所占空间之和,而是存在字节对齐的问题
union,它所有的元素共享同一内存单元,且分配给 union 的内存空间由类型最大的元素 size 来确定
因此在使用union时容易犯的错误就是,给一个union的多个元素赋值;由于共享内存,最后的赋值会覆盖前面所有的值,实际上只对最后的元素赋值
二:struct字节对齐问题(gcc编译器)
每个元素相对于结构体的首地址的偏移量能被该元素的size整数;如果该元素size>4,则偏移量能被4整除即可
另外struct的总size并没有严格为4或8的倍数;不过这个问题还是跟编译器和平台有关,如果知道(也可以编译器设置)参数信息,要计算出来不难
测试代码:
#include
#include
usingnamespace std;
#define LL longlong
struct E1 {
int a;char b;char c;
}e1;
struct E2 {
char b;int a;char c;
}e2;
struct E3 {
char a;short b;int c; LL d;
}e3;
struct E4 {
int c; LL d;char a;short b;
}e4;
struct E5 {
char a1,a2,a3,a4,a5,a6;
}e5;
struct E6 {
char a1,a2,a3;
}e6;
struct E7 {
struct E5 elem5;
struct E6 elem6;
LL a;
}e7;
struct E8 {
char a[9];
}e8;
struct E9 {
struct E8 elem8;
LL a;
}e9;
struct E10 {
char a;
};
int main(){
puts("----> E1");
cout <
printf("%x %x %x %x\n",&e1,&e1.a,&e1.b,&e1.c);
puts("----> E2");
cout <
printf("%x %x %x %x\n",&e2,&e2.b,&e2.a,&e2.c);
puts("----> E3");
cout <
printf("%x %x %x %x %x\n",&e3,&e3.a,&e3.b,&e3.c,&e3.d);
puts("----> E4");
cout <
printf("%x %x %x %x %x\n",&e4,&e4.c,&e4.d,&e4.a,&e4.b);
puts("----> E5");
cout <
puts("----> E6");
cout <
puts("----> E7");
cout <
printf("%x %x %x %x\n",&e7,&e7.elem5,&e7.elem6,&e7.a);
puts("----> E8");
cout <
puts("----> E9");
cout <
printf("%x %x %x\n",&e9,&e9.elem8,&e9.a);
puts("----> E10");
cout <
return0;
}
输出:
E1
8
facd2140 facd2140 facd2144 facd2145
E2
12
facd2148 facd2148 facd214c facd2150
E3
16
facd2160 facd2160 facd2162 facd2164 facd2168
E4
24
facd2170 facd2170 facd2178 facd2180 facd2182
E5
6
E6
3
E7
24
facd21a0 facd21a0 facd21a6 facd21b0
E8
9
E9
24
E10
1
Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析相关推荐
- 整数边界对齐方式_c中结构体边界对齐(转)
c中结构体边界对齐(转) 2011-11-23 11:15:52| 分类: C&C++ | 标签: |字号大中小 C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.结构体到底怎 ...
- c语言将结构体存储在数组中,结构体数组方法用法 _C语言-w3school教程
C语言 的 结构体数组 在C语言编程中可以将一系列结构体来存储不同数据类型的许多信息. 结构体数组也称为结构的集合. 我们来看一个数组结构体的例子,存储5位学生的信息并打印出来.创建一个源文件:str ...
- C语言四川麻将算法,四川麻将中番种是如何计算的详细解析
同城游中的四川麻将里都是有番数的,不过对新手玩家而言,计番是个头疼的问题,那么麻将中有都哪些番数呢?现在赶紧来看看四川麻将番种是如何计算的详细解析吧. 四川麻将中基础牌型(格)与基本番数 平胡:普通的 ...
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
- c语言实现结构体变量private,C语言中结构体变量私有化详解
背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...
- 1、体脂手环、体脂秤等产品的体脂测量原理及技术方案分析
一.体脂检测属于人体成分分析中的一项 在医疗仪器领域早已应用较多.由于最近两年穿戴式设备的爆发,传统医疗仪器上的部分检测功能被搬到了手环.手表.水杯或体重秤等普通消费类电子上.比较常见的有计步.卡里路 ...
- c# 结构体 4字节对齐_C语言程序员们常说的“内存对齐”,究竟有什么目的?
在C语言程序开发中,有时有经验的程序员会提起"内存对齐"一词,事实上,这也是C语言中结构体的 size 不等于它所有成员 size 之和的原因(C语言中的结构体的size,并不等于 ...
- linux c 结构体参数,C语言结构体类型定义
C语言结构体类型定义 结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种: 1.先定义结构体,再定义变量: eg. struct student{ cha ...
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...
最新文章
- 融入产业生态的靶向孵化
- 21、 TRUNCATE:清空表记录
- java xml 验证工具_验证xml格式
- Github上Fork部署应用程序
- mysql workbench 1064_MySQL Workbench:查询错误(1064):第1行“ VISIBLE”附近的语?mysql-问答-阿里云开发者社区-阿里云...
- as3 crypto 加密解密des,rsa
- 由浅入深,解决三道【只出现一次的数】!
- VTN联合GWI共同启动“全球健康登月计划”让更多人享受到健康新生活
- 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗。
- idea 提示 TKK 更新TKK失败,请检查网络连接,解决办法!
- java消息中间件_java消息中间件
- LVS负载均衡群集合集
- win7 ftp安装搭建,并且上传图片到ftp文件夹下,使用nginx访问下载图片
- 操作演示 | 如何将示波器波形直接保存到PC端
- python爬取今日头条热点新闻事件,Python爬虫实战入门五:获取JS动态内容—爬取今日头条...
- [ 网络协议篇 ] 一篇文章让你掌握什么是 数字证书 ?什么是SSL ?什么是 TLS ?
- synergy一个鼠标控制多个电脑,synergy怎么用?synergy配置教程
- html 选择自动增加行数,为网页中的源代码自动设置行号
- seq2seq文本翻译的例子
- 随机信号处理AR模型Yule_Walker方程直接解法和Levinson_Durbin递推法的MATLAB与Python实现