内存中的数据对齐

原创 2012年03月25日 23:20:34

  今天初次接触到内存中的数据对齐,整理一下。先看代码

#include <iostream>
using namespace std;
typedef struct  
{
 char a[2];
 double c;
 int b;
}A;
typedef struct  
{
 char a[2]; 
 int b; 
 double c;
}B;
void main()
{
 cout<<sizeof(A)<<endl;
 cout<<sizeof(B)<<endl;
}

 

输出为:

24

16

为什么只是int 与 double的位置换了一下,为什么会产生这样的结果,原因就是数据对齐产生的结果。

所位数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍,DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽,x86 CPU能直接访问对齐的数据,当他试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐。

那么我们分析一下代码

A结构体:char a[2];系统会分配两字节的空间,但是需要与后面double对齐,你可以想象double为8字节,很宽。。前面的才2字节,是不是对不齐呢?所以编译器会自动填充,已达到对齐效果。int b;虽然只要4字节,但是他也需要与double对齐,所以编译器会自动填充4字节,以达到对齐效果,所以3*8=24字节。

B结构体:因为char后面为int,且char+int<=double  (凡是小的能在大的撑得下的情况下不开辟新的,撑不下的情况下开辟新的,比如  char a[2] + int b  == 6<8  放在一起。 char a[2] <8  直接开8 后面double  直接开8) 所以char只需与int对齐,然后两者加起来正好为8与double对齐了,所以占空间 2*4+8=16

数据对齐一般透明,由编译器调整,如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。

 

 

 

数据对齐/内存对齐 && 数据格式

字、双字、四字在自然边界上不需要在内存中对齐。(什么叫做字?见数据格式) 对字、双字、四字来说,自然边界分别是偶数地址、可以被4整除的地址、可以被8整除的地址。 无论如何,为了提高程序的性能,数据结构...
  • buxizhizhou530
  • buxizhizhou530
  • 2015年06月29日 11:57
  • 1091

关于内存中的数据对齐

概念: 数据对齐指的是,数据所在的内存地址必须是该数据长度的整数倍。比如在32位机中int 所在的内存起始地址能被4整除,short可以被2正处,double被8整除。 为什么要进行数据对齐? ...
  • G_BrightBoy
  • G_BrightBoy
  • 2011年10月02日 19:35
  • 1118

嵌入式中的数据对齐

首先要提到总线宽度这个概念,我们平常提到的32位处理器、64位处理器,就是指的总线宽度为32、64位,也就是在一个处理器访问周期中访问的数据位数。对于某些处理器多字节访问必须从偶数字节开始,如果从奇数...
  • u010945683
  • u010945683
  • 2015年04月26日 18:06
  • 738

计算机中的内存对齐以及内存的堆栈分配原理

在大多数低层程序设计中,由于内存分配与内存对齐问题所带来的bug所占比重非常大。本文对内存分配中的分配空间类型、作用、方法、适用范围、优缺点以及内存对齐问题中的对齐原因、对齐规则等进行了详细的说明,并...
  • liuyinghui523
  • liuyinghui523
  • 2016年04月18日 08:48
  • 866

内存/边界对齐(boundary alignment)简介

一、什么是内存对齐
  • acs713
  • acs713
  • 2014年05月05日 13:21
  • 3122

内存中的数据对齐

数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。  当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员...
  • buyingfei888
  • buyingfei888
  • 2014年03月20日 16:15
  • 1046

谈谈关于内存对齐与补齐

首先我们先看看下面的C语言的结构体: typedef struct MemAlign { int a; char b[3]; int c; }MemAlign;     以上这个结构体占用内存...
  • cyousui
  • cyousui
  • 2013年12月29日 16:33
  • 6840

初学者对于结构体内存对齐与补齐的理解

1、问题提出: 刚开始学习结构体的时候,我们通常认为结构体struct number_1 { int a; int b; int c; }st1;占用空间为sizeof(st...
  • Apollon_krj
  • Apollon_krj
  • 2016年05月03日 10:59
  • 2594

内存中数据对齐相关

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://bigwhite.blogbus.com/logs/1347304.html在最近的项目中,我们涉及到了“内存对齐”技术。...
  • hjxhjh
  • hjxhjh
  • 2011年02月10日 16:50
  • 1233

内存分配对齐

1. 调用palloc()函数,实现动态分配地址对齐的内存(但是很多系统中默认是不提供这个接口的,不过大多数底层硬件商都在里面做了这个接口) 2. 动态分配对齐的内存:自己在malloc()函数的...
  • opentld
  • opentld
  • 2014年10月28日 16:21
  • 593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存中的数据对齐
举报原因:
原因补充:

(最多只允许输入30个字)