struct和Union的内存分配

eg:

struct node{
    char c  ;
    int x ;
};

在你定义一个这个的node后, 系统给它分配的内存不是简单的就是sizeof(char)+sizeof(int)= 5 ;  而是采用内存对齐的方式 。

首先在计算机中 , 会有一个默认的参数 , 即对齐膜数 , 一般默认为8字节 , 但可以通过在程序中添加如下命令来改变其值

#pragma pack(n) ;

 在知道对齐模数后, 就可以开始说对齐规则了

1:在系统给其分配内存时 , 是安照你定义的先后的原则 , 比如说上面node先定义了char , 然后定义int , 那么系统会先给char分配内存, 然后给int分配

2:系统先给第一个定义的类型分配空间后, 然后在分配第二个类型时 , 其相对于struct的起始位置的偏移量一定是min(对齐模数  , 本类型的字节大小)的整数倍 ,

比如说给node分配内存 ,对齐参数为2 , 在起始位置0x00给char分配1byte的空间 , 然后分配int时 , int类型的内存起始位置就是min(2,4)的整数倍 , 最小为2,

 所以int的起始位置就是0x02 , 如果对齐参数为4的话, 那么就可算出起始位置为0x04 ;

3:在给所有的类型分配完空间后, struct的总空间为min(对齐模数 ,struct中最大的类型的字节)的整数倍 ,

  eg:

  

#pragma pack(8) ;
struct node{
    double x;   char c ;
};

  安照前面两个原则 , double内存起始位置为0x00 , char起始位置为0x09 , 这样总空间就是9byte , 但是因为有第三条规则 ,总空间必须为min(sizeof(double) ,8)的整数倍 ,所以总空间就是16字节。

2union在分配内存时 , 其总空间为min(对齐模数, union中最大类型的字节)的整数倍 ,并且总空间必须要>=union中定义的最大空间 。

  eg:

  

#pragma pack(8) ;
typedef union{
    char c[10] ;
    int x ;
}U ;

  min(8 , sizeof(int)) = 4 ;  所以可选的总空间值有4 , 8 ,12  ,。。。。。 , 但是因为你定义了一个char数组, 大小为10 , 需要10byte , 所以4跟8太小 , 所以总空间为12。

时间: 2024-10-02 10:04:06

struct和Union的内存分配的相关文章

<转> Struct 和 Union区别 以及 对内存对齐方式的说明

转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息. 2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在. 3.对于Union的不同成

linux内核内存分配(二、struct slab和struct kmem_cache)

前一篇bloglinux内核内存分配(一.基本概念)主要是分析linux内核内存的分配和物理页分配函数接口.但是在实际的操作中,不一定所有内存申请都需要一个物理页,很多只是需要分配几K大小的内存就可以.所以就需要更小的内存分配函数.刚开始看这个有点不懂,不过懂了就很简单了.哈哈. slab思想 摘抄<深入linux设备驱动程序内核机制>的一段话:slab分配器的基本思想是,先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配

【转】C/C++ struct/class/union内存对齐

原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括stru

C/C++ struct/class/union内存对齐

struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon. 2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"

我所理解的内存分配算法(一)

内存分配从本质上来说是一种空间管理算法,给你一块连续的空间,提供存储服务,那么你的空间管理跟分配要采用什么样的算法才会比较高效? Bump-the-Pointer Bump-the-Pointer是最简单的算法.HotSpot的MM白皮书是这么描述btp的, That is, the end of the previously allocated object is always kept track of. When a new allocation request needs to be s

python源码分析----内存分配(2)

早就应该写部分的内容了....最近比较负能量...伤不起啊.. 上一篇说到了,在python的内存分配中两个非常重要的方法:PyObject_Malloc和PyObject_Free 在具体的来这两个方法之前,先要看看别的一些东西 //这里用usedpool构成了一个双向链表 //只用了两个指针就搞定了..我擦... //这里将保存的地址减去了两个指针的大小,那么根据pool结构体的定义,那么将地址加上两个指针,正好就是next,加上3个指针正好就是prev //比较的巧妙 #define PT

python源码分析----内存分配(1)

上面的一篇粗略的介绍了一下python的对象结构,这篇来分析一个非常重要的部分,内存分配... 好像自己看的源代码,只要是跟C语言相关的,都在内存处理方面做了相当多的工作....例如nginx,它也有实现自己的pool,python当然也不例外.... python在内存分配上面分成了4个层次吧... _____   ______   ______       ________ [ int ] [ dict ] [ list ] ... [ string ]       Python core

struct和union的区别

当初学习C语言时并没有特别注意 union 的用法,也不知道与 struc t相比有何不同.经过网上的一番搜索,现在总算是恍然大悟,所以就小结一下.如有错误之处,敬请指正.( struct 和 union 的结构定义形式没有多大差别,只要不是初学者,相信大家不会在这方面存在什么问题.) struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间.那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

c/c++深入篇之内存分配与内存对齐的探讨

 不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下.       此文章有2个用处,1:这是个小论文,格式完整,大家可以复制回去交作业:2:这是整理的经典C内存分配小教程(也加了些我自己的观点),不明白内存分配的可以看看. 还有很重要的一个问题:      这篇文章引用的很多内容我也不知道究竟是出自谁手,知道作者是谁的麻烦告诉下,我好谢谢他.(记得都是csdn里面找的) tag: 操作系统 论