开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

32、64位数据类型占用字节以及内存对齐原理

简介: 32、64位数据类型占用字节以及内存对齐原理
+关注继续查看

32位编译器:32位系统下指针占用4字节


  char :1个字节
  char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
  short int : 2个字节
  int:  4个字节
  unsigned int : 4个字节
  float:  4个字节
  double:   8个字节
  long:   4个字节
  long long:  8个字节
  unsigned long:  4个字节


64位编译器:64位系统下指针占用8字节



  char :1个字节
  char*(即指针变量): 8个字节
  short int : 2个字节
  int:  4个字节
  unsigned int : 4个字节
  float:  4个字节
  double:   8个字节
  long:   8个字节
  long long:  8个字节
  unsigned long:  8个字节


内存对齐原理


1.什么是内存对齐


假设我们同时声明两个变量:


char a;
short b;


用&(取地址符号)观察变量a,


b的地址的话,我们会发现(以16位CPU为例):


如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004。


那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?


答案就是它确实没被使用。 因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的。如果变量b的地址是0x0001的话,那么CPU就需要先从0x0000中读取一个short,取它的高8位放入b的低8位,然后再从0x0002中读取下一个short,取它的低8位放入b的高8位中,这样的话,为了获得b的值,CPU需要进行了两次读操作。


但是如果b的地址为0x0002,


那么CPU只需一次读操作就可以获得b的值了。所以编译器为了优化代码,往往会根据变量的大小,将其指定到合适的位置,即称为内存对齐(对变量b做内存对齐,a、b之间的内存被浪费,a并未多占内存)。


2.结构体内存对齐规则(请记住三条内存规则(在没有#pragam pack宏的情况下)


结构体所占用的内存与其成员在结构体中的声明顺序有关,其成员的内存对齐规则如下:


(1)每个成员分别按自己的对齐字节数和PPB(指定的对齐字节数,32位机默认为4)两个字节数最小的那个对齐,这样可以最小化长度。如在32bit的机器上,int的大小为4,因此int存储的位置都是4的整数倍的位置开始存储。


(2)复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,结构体数组的时候,可以最小化长度。


(3)结构体对齐后的长度必须是成员中最大的对齐参数(PPB)的整数倍,这样在处理数组时可以保证每一项都边界对齐。


(4)结构体作为数据成员的对齐规则:在一个struct中包含另一个struct,内部struct应该以它的最大数据成员大小的整数倍开始存储。如 struct A 中包含 struct B, struct B 中包含数据成员 char, int, double,则 struct B 应该以sizeof(double)=8的整数倍为起始地址。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
TCGA数据库的利用(一)—— 数据下载
还有1个多月就要毕业了,而在此之前需要顺利完成自己的毕设,因为对纯生物方向一点也不感兴趣,所以课题方向选的是生信—TCGA数据的利用,虽说本科专业与生物相关,但在整个大学期间基本就是在不挂科的情况下尽可能地与生物对着干,所以大学四年过后么,就有一种虽学生物、但毫不懂生物的状态。为了能够顺利拿到毕业证,经过这段时间的“刻苦钻研”也算是多少对于这方面有点了解,因此特地写个系列来巩固一下这方面知识的掌握。 对于数据的利用的第一步就是获取数据,对于数据的下载与利用,在这里我下载TCGA数据的主要方法就是通过官网的下载工具gdc-client进行下载的;
46 0
PL/SQL Developer32位连接Oracle64位数据库步骤
第一步:安装Oracle数据库64位的 第二步:下载pL/sql developer32 第三步:下载 oracle Clinet        sqldeveloper-4.0.1.14.48-no-jre.zip   解压放到c盘里面 第四步:然后在解压后的C:\instantclient_11_2目录下新建NETWORK\ADMIN目录,在ADMIN目录下新建tnsnames.ora文件,添加数据库TNS。
6056 0
海量数据处理的 Top K算法(问题) 小顶堆实现
  问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10)   问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。
915 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载