字节对齐

为什么字节对齐?

一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问

为了提高CPU访问内存中的数据的效率在给每个数据变量分配内存空间时,需考虑地址对齐

(1)自然对齐:在给数据分配内存空间时,如果各成员数据的空间的起始地址能够被数据的长度整除,结构的总大小是最大sizeof(类型)的整数倍

typedef struct _a

{

char c1;

long i;

char c2;

double f;

}a;

typedef struct _b

{

char c1;

char c2;

long i;

double f;

}b;

结构体a的长度为24,c1一个字节,i四个字节,为了对齐,C1要补齐3个字节,C2一个字节,f八个字节,为了对齐,C2要补齐3个字节,这里一共20个字节,因为总长度要是最大sizeof(double)的倍数,所以要为24个字节

结构体b的长度为16,c1一个字节,C2一个字节,补齐2字节,i四个字节,f八个字节,一共为16个字节,也是8的倍数

(2)适当对齐:在给数据分配内存空间时,如果数据的空间的起始地址能被数据的M值整除,结构的总大小是M值的整数倍

对于不同的数据都存在一个M值

当数据的长度

当数据的长度>机器字长M=机器字长

基本数据:长度对齐

数组:     以元素的M值对齐

指针:     以4字节对齐

联合体:   成员中最大的M值对齐

结构体:   成员中最大的M值(成员排序不同,所占内存大小不一样)

struct A{

char x;

int y;

short z;

}st1;

struct B{

char x;

short z;

int y;

}st2;

结构体A总长度为12,首先看M值,最大的是y,四个字节,未超过机器字节,所以M为4,x一个字节,补齐3字节,y四个字节,z两个字节,补齐2字节,一共12字节,是M的倍数

结构体B总长度为8,M值也是为4,x一个字节,z两个个字节,补齐一个字节,y四个字节,一共8个字节,是M的倍数

从上面可以看到,结构体成员是一样的,但是顺序不一样,导致了占用的空间不一样,所以我们在定义结构体成员时,最好是按字节长度从小到大定义,可以节省空间

(3)栈上对齐:函数内的变量一般都是存在栈上的,x86平台是四字节对齐,x64平台是16字节对齐

Void test(void)

{

char c =0;

int a = 4;

char str[10]= "hello";

float f = 2.0f;

f = a+c;

}

占用空间是24字节,c一个字节,补齐3字节,a四个字节,str占10个字节,补齐2字节,f四个字节,一共24字节

java 字节对齐_字节对齐相关推荐

  1. 两端分散对齐怎么设置_excel两端对齐_分散对齐怎么设置

    excel两端对齐_分散对齐怎么设置--在Excel中对包含文本的单元格设置文本对齐方式时,无论是"水平对齐"还是"垂直对齐"都有多种对齐方式可供选择. 其中& ...

  2. 字节跳动 java面经_字节跳动Java面经(已offer)

    5.15 一面(3点开始,80分钟) 1.自我介绍,聊了聊学校近况 2.Java 集合框架,看了哪些源码,arraylist.linkedlist原理,让你实现一个 hashmap 机会如何设计(没让 ...

  3. 论文公式编号右对齐_公式对齐(二):公式居中,编号右对齐(MathType 6.9)

    "公式居中,编号右对齐"的对齐方式适用于较大多数场合,比如,学位论文.国内外期刊论文等. 1.最想分享的还是"MathType 6.9"软件的自动编号功能,不过 ...

  4. mysql字节对齐_结构体字节对齐-位域及其对齐

    字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...

  5. 对齐方式有那些_字节对齐不慎引发的挂死问题

    前言 之前程序是32位的,切到64位之后,一些隐藏的问题就暴露了.这不,一个由字节对齐导致的挂死问题就出来了. 字节对齐和64位 关于字节对齐,可参考<理一理字节对齐的那些事>,而之前也分 ...

  6. mysql字节对齐_结构体字节对齐(转)

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是 ...

  7. java 多线程写缓存,Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

  8. 顶级c程序员之路 选学篇-1 深入理解字节,字节序与字节对齐

     深入理解字节,字节序与字节对齐 一 总述 作为一个职业的coder玩家,首先应该对计算机的字节有所了解. 我们经常谈到的2进制流,字节(字符)流,数据类型流(针对编程),结构流等说法,2进制流,0和 ...

  9. 什么是字节对齐?字节对齐与位域的计算

    目录 1.什么是字节对齐?为什么要字节对齐? 2.字节对齐的规则 3.字节对齐的数值 4.位域 5.位域的填充 1.什么是字节对齐?为什么要字节对齐? 字节对齐也称为字节填充, 它是一种牺牲空间换取时 ...

最新文章

  1. 张一鸣的微博世界-产品篇一
  2. 【十大经典数据挖掘算法】k-means
  3. Python爬虫day1.2—Python语法基础
  4. E:VUE 插件 开发与使用 (一)
  5. java 个税计算_【JAVA300例】10、计算个人所得税
  6. [转发]黑苹果修改DSDT彻底解决关机不断电和睡眠问题
  7. 中文文档列表 - Oracle Database (文档 ID 1533057.1)
  8. 史上最详细的虚拟机VMware12安装Windows7教程
  9. Python基础项目:超市购物管理系统
  10. selenium之qq邮箱登录-发邮件
  11. Draco使用笔记(1)——图形解压缩
  12. P5514 [MtOI2019]永夜的报应
  13. css fixed定位失效问题
  14. 小菜鸟学浏览器之感悟
  15. Android Things:让你陌生的面包板
  16. Tiled-免费2D游戏场景Tile编辑器
  17. Parameter index out of range (2 > number of parameters, which is 1).原因及处理
  18. RA layer request failed
  19. 《重构》第七章--读书笔记
  20. js实现两张图片来回切换

热门文章

  1. Linux curses库
  2. java json 嵌套解析_Java 嵌套解析 json
  3. 桃李教育 高中计算机教师,倾情桃李,做教育的有心人——雅礼书院中学教师风采(七)...
  4. 树莓派python手势识别控制_python树莓派相机实现手势识别源码调用的百度API_新锐下载...
  5. 卷积计算过程中的减少计算量的优化方式
  6. 用Edge将GitHub上的markdown文件在线完美转pdf
  7. matlab等号左边,matlab等号左侧的表达式不是用于赋值的有效目标。
  8. 连续因果森林模型在网约车交易市场策略上的应用
  9. python的代码是什么样的图片_python实现识别相似图片小结
  10. springboot jar包解压后运行