博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【底层原理】高级开发必须懂的"字节对齐"
阅读量:5063 次
发布时间:2019-06-12

本文共 657 字,大约阅读时间需要 2 分钟。

认识字节对齐之前,假定int(4Byte),char(1Byte),short(2Byte)

 

认识字节对齐

先看段代码:

struct Data1{char a;int b;short c;};struct Data2 {int a;char b;short c;};int main(){cout << sizeof(Data1) << endl;cout << sizeof(Data2) << endl;getchar();return 1;}输出结果:128

 

sizeof(Data1)和sizeof(Data2)分别表示Data1和Data2内存占用字节数,输出结果不一样是因为编译时对Data1和Data2做了不同的字节对齐。Data1的对齐为4Byte,Data2的对齐是2Byte。

 

假定存储起始地址为0x00,存储模型如下:

 

 

结构体或类中的每个成员都是内存对齐的。

 

编码时可以使用#pragma pack(x)来指定字节对齐大小,x必须为2的n次方,否则设定的字节对齐大小不生效。如上段代码开头加上#pragma pack(4),输出结果均为12。

 

为什么要字节对齐

首先明确:CPU从内存中读取数据的起始地址是对齐的。如下内存存储,cpu一次读取8个字节,对于int型数据则需要两次读取。如不对齐会降低执行效率。

内存对齐目的:为了让CPU一次性获得基本类型的数据,从而提升程序执行效率。

 

 

转载于:https://www.cnblogs.com/woniu201/p/10931781.html

你可能感兴趣的文章
Kubernetes 运维学习笔记
查看>>
spring security 11种过滤器介绍
查看>>
代码实现导航栏分割线
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>