当前位置:网站首页>字节对齐之C语言犄角旮旯的知识
字节对齐之C语言犄角旮旯的知识
2022-07-30 21:05:00 【勾栏听曲_0】
目录
字节对齐
什么是字节对齐
从内存访问的效率出发,CPU底层或者编译器一般会要求,所有的对象的地址按照某种方式来对齐。
一般来说,就是要求对象的地址是n的倍数。
对齐方式
n字节对齐
对象的地址是n的倍数(n一般为2的x次幂)
eq:
4字节对齐:所有对象的地址必须为4的倍数。
8字节对齐:所有对象的地址必须为8的倍数。
16字节对齐:
。。。
GCC代码中:
程序员可以指定对齐方式:
__attribute__((aligned(n))
自然对齐
编译器默认的一种对齐方式(32bits与64bits编译器会有不一样)。
32bits | 64bits | |
char | 1字节对齐 | 1字节对齐 |
short | 2字节对齐 | 2字节对齐 |
int | 4字节对齐 | 4字节对齐 |
long | 4字节对齐 | 8字节对齐 |
long long | 4字节对齐 | 8字节对齐 |
any pointer | 4字节对齐 | 8字节对齐 |
double | 8字节对齐 | 8字节对齐 |
对象的地址必须是对象长度的倍数,什么意思呢?
举个栗子:
sizeof(int) = 4;
int a;
&a :必须为4的倍数
if &a不是4的倍数,说明a不是自然对齐。
sizeof(short) = 2;
short a;
&a : 必须为2的倍数
if &a不是2的倍数,说明a不是自然对齐
sizeof(long) = 8;
long b;
&b:b的地址必须是8的倍数
sizeof(char) = 1;
char c;
&c:c的地址必须是1 的倍数
每个变量(包括结构体中的成员变量)都会有一个默认的对齐方式:--》自然对齐
那么结构体的对齐方式
(1)结构体变量按其最大的类型成员变量的对齐方式对齐
(2)结构体的大小必须为其对齐方式的整数倍(一般都为向上取整)
举个例子:
struct test
{
char a; //a的对齐方式:一字节对齐
int b; //b对齐的方式:四字节对齐
short c; //c对齐的方式:2字节对齐
};
struct test 按照b的对齐方式进行对齐:4字节对齐
struct test 变量 (整个结构体)大小必须是4的整数倍。
sizeof(struct test); ==> 12
再思考两个
struct finalPadShort
{
short x;
char n[3];
};
sizeof(struct finalPad); //6
struct MixedData
{
char data1;
short data2;
int data3;
char data4;
};
sizeof(struct finalPad); //12
最后一个为什么是12呢,我们来看图,以下就是它的存储形式
地址低位 | 地址高位 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
char | short | short | X | int | int | int | int | char | X | X | X |
如图,第一个成员变量是char,占1字节,第二个成员变量是short,占2字节,这两个成员变量加起来没有超过int的4字节,可以放在一个4字节中,所以一共是3个4字节,
sizeof(struct finalPad) == 12。
边栏推荐
- MySQL Workbench 安装及使用
- 一个网络两种用途!南开&哈工程提出TINet,通过细化纹理和边缘,在显著性目标检测和伪装目标检测上实现双SOTA!...
- MySQL group_concat()详解
- 多线程获取官方汇率
- 6.3有定型性 第七章
- [Deep Learning] Target Detection | SSD Principle and Implementation
- [Deep Learning] Understanding of Domain Adaptation in Transfer Learning and Introduction of 3 Techniques
- Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
- 转义字符笔记记录
- Oracle ADG状态查看与相关视图
猜你喜欢
啊?现在初级测试招聘都要求会自动化了?
MySQL笔记1(数据库的好处,数据库的概念,数据库的特点,MySQL的启动,数据模型,SQL)
在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块
R package调试
《快速掌握QML》第六章 动画
Oblique document scanning and character recognition (opencv, coordinate transformation analysis)
Android studio连接MySQL并完成简单的登录注册功能
Image Restoration by Estimating Frequency Distribution of Local Patches
新书上市 |《谁在掷骰子?》在“不确定性时代”中确定前行
flowable工作流所有业务概念
随机推荐
Oracle ADG状态查看与相关视图
《快速掌握QML》第六章 动画
Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
深度学习模型训练前的必做工作:总览模型信息
mysqldump导出提示:mysqldump [Warning] Using a password on the command line interface can be insecure
nVisual网络可视化管理平台功能和价值点
弹性盒子模型
Swift RegexBuilder Vs. Raku Grammar
MySQL 高级(进阶) SQL 语句 (一)
HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态
数字货币期货现货交易技巧,把握关键进场的买入点!(纯干货)
PR视频剪辑软件教程
【限时福利】21天学习挑战赛 - MySQL从入门到精通
flyway的快速入门教程
肖特基二极管厂家ASEMI带你认识电路中的三大重要元器件
化二次型为标准型
用于视频压缩伪影消除的深度卡尔曼滤波网络
对一次生产环境产生OOM的记录,结论:除非在自己完全有把握的情况下,否则不要偷懒查询无用字段
@WebServlet注解(Servlet注解)
5分钟搞懂MySQL - 行转列