`
plussai
  • 浏览: 88744 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struct内存分配

阅读更多
百度的笔试题
struct s1 { 
char ch, *ptr; 
union { 
short a, b; 
unsigned int c:2, d:1; 
} 
struct s1 next; 
}; 

的大小是_____:
A. 12字节 B.16字节 C.20字节 D. 24字节
答案:12字节
简单的一道问题,蕴涵着丰富的C++内存管理原则和基础知识。
   为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
char   偏移量必须为sizeof(char)即1的倍
short  偏移量必须为sizeof(short)即2的倍数
int    偏移量必须为sizeof(int)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
参考:http://www.programfan.com/blog/article.asp?id=38666
下面来分析一下上面的问题
char ch 起始偏移量0 占一个字节
char *ptr 起始偏移量1,指针类型占4字节,因此必须填充3个字节
union 的字节数为内部成员中字节数最大的值,在此为2个字节,union的起始偏移量为8个字节,无需填充。
综上struct的占的字节数为1+3+4+2=10BYTE,但是,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(*ptr)=4)的倍数,所以需要填充2个字节,以满足结构的大小为sizeof(*ptr)=4的倍数。
所以该结构总的大小为:sizeof(s1)为1+3+4+2+2=12。其中总的有2+3=5个字节是自动填充的,没有放任何有意义的东西。
以上代码在VC,GCC中都通过测试







分享到:
评论

相关推荐

    操作系统课程设计模拟内存分配

    首次适应和循环首次适应算法模拟内存分配2008-07-01 09:40/******************************** 内存管理模拟程序 *******************************/ #include #include #include #include #include #include /*定义...

    空间内存的分配与回收

    空间内存的分配与回收 #include"stdio.h" #include"iostream.h" #include"string.h" #include"iomanip.h" const int MAXJOB=100;//定义表最大记录数 struct job{ int start; int length; char tag[20]; }; struct ...

    内存管理内存管理内存管理

    程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...

    MemoryAllocator:自定义内存分配器

    内存分配器 基于显式空闲列表的自定义内存分配器 有几种常用的实现自定义内存分配器的方法,例如隐式空闲列表,显式空闲列表,隔离的空闲列表和平衡的二进制搜索树,每种方法各有优缺点。 在这里,我使用显式的空闲...

    操作系统(内存管理)

    因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个...

    动态分配结构体内存(malloc)

    提示:不能使用指针pcarinfo将已分配的内存区域释放,因为此时由于for循环内pcarinfo做自增运算,其所指位置已不再是动态分配内存的首地址了,因此必须使用pcarinfo释放动态分配的内存。 #include #include struct ...

    C/C++网络传输struct类型数据

    在网络通讯过程中往往涉及一些有关联的参数传递...对于结构体其实方法挺简单,由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接转化成字符串发送,到了接收方再将这个字符串还原成结构体就可以了

    talloc:分层内存分配器

    塔洛克 Talloc 是一个分层的内存分配器。 这意味着它类似于malloc ,但它也可以跟踪内存依赖的自然树状结构。 释放一个talloc-ed内存块将释放它的所有依赖项。例子作为一个例子,我们开发了一个二维整数矩阵的分配...

    ljson to struct 源码

    2. 基于自定义堆栈设计,不使用动态内存分配,不使用递归 3. 解析模块在解析json时调用callback 4. 在callback中将数据存入C结构体 5. 独立的输出模块,支持NULL缓冲获取输出所需长度 6. 支持从json数据自动生成C...

    linux内存管理-FAQs.pdf

    与内存管理系统相关的各种flags汇总如下... 在申请内存时, 需要使用gfp flags, 详情见2.4.5节的《分配掩码GFP_XXX》  kmem_cache_create函数需要用到SLAB flags, 详见2.5.3节《APIs》中关于kmem_cache_create的介绍

    neicun.rar_Unsigned_memory

    我所采用的内存管理思想是链表管理思想,内存分配方案是最佳适应方案(best fit)。其主要的数据结构为 struct node { char* p int memosize int flag struct node* next } 这是一个链表的结点的数据结构,...

    疯狂内核之——Linux虚拟内存

    3.1 用户态内存分配 117 3.1.1 mm_struct数据结构 118 3.1.2 内核线程的内存描述符 122 3.2 线性区的数据结构 123 3.2.1 线性区数据结构 123 3.2.2 红-黑树算法 126 3.2.3 线性区访问权限 128 3.3 线性区的底层处理 ...

    模拟内存操作二叉树首选法

    struct freearea/*定义空闲区说明结构,并初始化变量*/ { int startaddress;/*空闲区地址*/ int size;/*空闲区大小*/ int state;/*空闲区状态*/ }freeblock[N]={{20,20,1},{80,50,1},{150,100,1},{300,30,0},{600...

    C++学习笔记、常见面试知识点.zip

    C++学习笔记和常见面试知识点,C++11特性,包括多态、虚表、移动语义、友元函数、符号重载、完美转发、智能指针、const和static、数组指针和指针数组、struct内存对齐、enum和union关键字等等。帮助了解C++的特性,...

    动态分配结构体内存(calloc)

    类型说明符为强制类型转换,n和size的作用是在内存动态存储区域中分配n块长度为size字节的连续存储区域,函数返回值为该区域首地址。 例如: struct addrbook { char name[30]; char mobilephone[20]; char addr...

    C++程序内存泄露检测工具

    的过程中,须要记录用户程序内存分配信息,所以工具本身必须进行内存动态分配。为了提高内存分配效率,程序实现了两个链表。  1、空暇链表,事实上是一个简单的内存池 //定义一个结构,保存内存分配信息 typedef...

    StructLinq:使用struct在LINQ概念的C#中实现

    在LINQ概念的C#中使用struct进行实现,以大大减少内存分配并提高性能。 当元素为胖结构时,引入IRefStructEnumerable以提高性能。 安装 该库通过分发。 要安装 : PM> Install-Package StructLinq 要安装BCL包装...

    解析C语言中位字段内存分配的问题

    它的目的是在一个机器字中保存多个对象(每个对象占据若干bit),从而节省内存资源,同时又避免复杂的位运算。在此不再讨论位字段的具体语法,下面将研究位字段的存储特性。 先说含有多个字段(field)的字(word)...

    rust-alloc-no-stdlib:通用分配器的接口,因此no_std rust库可以在有或没有stdlib链接的情况下分配内存

    这提供了一种机制,可以描述通过不安全地链接到calloc或不安全地引用可变全局变量,可以完全在堆栈上满足的内存分配。 如果未专门在内存上调用free_cell,则该库当前将泄漏内存。 但是,如果由实际上依赖于stdlib...

    操作系统课

    2、 同时模拟内存空间为作业分配内存空间,并把结果用图形形象地表示出来,同样通过终端输出。 3、 按进程的优先级的顺序撤消进程,同时通过终端显示PCB的撤消过程和内存的释放过程。 */ //初始化进程控制块 void ...

Global site tag (gtag.js) - Google Analytics