当前位置:网站首页>字节对齐之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。
边栏推荐
- flowable工作流所有业务概念
- 2022-07-29 mysql/stonedb慢SQL-Q17-分析
- 5分钟搞懂MySQL - 行转列
- 无法正常访问服务器
- Android studio连接MySQL并完成简单的登录注册功能
- mpls简介
- GPGGA NTRIP RTCM 笔记
- Why do so many people who teach themselves software testing give up later...
- [Limited Time Bonus] 21-Day Learning Challenge - MySQL from entry to mastery
- Structured Streaming报错记录:Overloaded method foreachBatch with alternatives
猜你喜欢
![KEIL problem: [keil Error: failed to execute 'C:\Keil\ARM\ARMCC']](/img/24/762cec2b4495e80a3e45fac1fac13e.png)
KEIL problem: [keil Error: failed to execute 'C:\Keil\ARM\ARMCC']

5分钟搞懂MySQL - 行转列

【网络安全专栏目录】--企鹅专栏导航

R package调试

DPW-SDNet: Dual Pixel-Wavelet Domain Deep CNNs for Soft Decoding of JPEG-Compressed Images

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

MySQL的DATE_FORMAT()函数将Date转为字符串

MySQL60 homework

WPS没有在任务栏显示所有窗口选项怎么回事?

vlan简单实验
随机推荐
第03章 用户和权限管理【1.MySQL架构篇】【MySQL高级】
Image Restoration by Estimating Frequency Distribution of Local Patches
MySQL BIGINT 数据类型
flyway的快速入门教程
如何制作deb包
第04章 逻辑架构【1.MySQL架构篇】【MySQL高级】
bgp路由过滤
【深度学习】目标检测|SSD原理与实现
C language: detailed explanation of operators
2021年PHP-Laravel面试题问卷题 答案记录
JSESSIONID description in cookie
QUALITY-GATED CONVOLUTIONAL LSTM FOR ENHANCING COMPRESSED VIDEO
2.网络资源访问工具:requests
uni-app开发微信小程序踩坑
MySQL——几种常见的嵌套查询
导航栏----个人中心 Dropdown
Structured Streaming报错记录:Overloaded method foreachBatch with alternatives
Oblique document scanning and character recognition (opencv, coordinate transformation analysis)
KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份
MySQL60 homework