当前位置:网站首页>字节对齐之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); //6struct 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。
边栏推荐
- Use the map function to operate on each element in the list It seems that you don't need a map
- KingbaseES TOAST存储方式
- opencv,numpy,tensor格式转换
- chrome扩展:如何使对话框位于当前窗口的右侧?
- Generate OOM records in a production environment. Conclusion: Don't be lazy to query useless fields unless you are completely sure.
- mysql8安装步骤教程
- 【机器学习】梯度下降背后的数学之美
- 对一次生产环境产生OOM的记录,结论:除非在自己完全有把握的情况下,否则不要偷懒查询无用字段
- 【网络安全专栏目录】--企鹅专栏导航
- MySQL 多表关联一对多查询实现取最新一条数据
猜你喜欢
![[Deep Learning] Understanding of Domain Adaptation in Transfer Learning and Introduction of 3 Techniques](/img/51/b351385c1f0f4e0a545e54c8ae7491.png)
[Deep Learning] Understanding of Domain Adaptation in Transfer Learning and Introduction of 3 Techniques

Mysql8创建用户以及赋权操作

c语言:操作符详解

MySQL的主从复制

Outsourcing worked for three years, it was abolished...

365天挑战LeetCode1000题——Day 044 按公因数计算最大组件大小 并查集

KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份

MySQL----多表查询

Mysql索引特性(重要)

网络安全实验环境搭建
随机推荐
ENS 表情包域名火了!是炒作还是机遇?
MYSQL JDBC图书管理系统
【luogu P8031】Kućice(计算几何)
HJ85 longest palindrome substring
365天挑战LeetCode1000题——Day 044 按公因数计算最大组件大小 并查集
MySQL60题作业
MySQL----多表查询
7.联合索引(最左前缀原则)
PR视频剪辑软件教程
c语言:操作符详解
数据指标口径不统一、重复开发?亿信ABI指标管理平台帮你解决
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
Deep Kalman Filter Network for Video Compression Artifact Removal
MySQL的主从复制
MySQL8重置root账户密码图文教程
如何制作deb包
mysql死锁
Deep Non-Local Kalman Network for VideoCompression Artifact Reduction
IDEA2018.3.5取消双击Shift快捷键
外包干了三年,废了...