`
plussai
  • 浏览: 90697 次
  • 性别: 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中都通过测试







分享到:
评论

相关推荐

    动态内存分配实验报告

    动态内存分配是编程中一种重要的内存管理方式,它允许程序在运行时根据需要动态地请求内存,而不是在编译期间预设固定的内存空间。在C++编程语言中,动态内存分配主要通过`new`和`delete`关键字来实现。本实验报告...

    struct和union结构体和联合体的区别.pdf

    - **Struct内存分配**:当创建一个结构体变量时,系统会根据结构体内各成员所需的空间大小为其分配连续的内存区域。因此,结构体变量所占用的总内存空间等于所有成员所占内存空间的总和。 - **Union内存分配**:与...

    模拟内存分配实验报告

    ### 模拟内存分配实验知识点总结 #### 实验背景与目的 本次实验是关于操作系统的模拟内存分配实验,旨在帮助学生深入理解操作系统中内存管理的关键技术。通过实践操作,学生可以掌握不同内存分配策略的工作原理及其...

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

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

    操作系统大作业之动态分配内存

    对于内存分配,根据不同的场景和需求,有不同的算法和技术来支持。本实验旨在通过实践操作加深学生对内存管理技术的理解,特别是对动态分区分配算法的认识。 #### 实验目标与要求 - **实验目的**:掌握并实现动态...

    动态内存分区分配方式模拟设计

    1. `struct allocquery`:这个结构体用于存储内存分配请求的信息,包括请求编号(`num`),状态(`state`,'a'表示申请,'f'表示释放)以及请求的长度(`length`)。 2. `struct freequery`:此结构体用于表示内存...

    task_struct在内核态堆栈的位置

    在Linux系统中,每个线程都有自己的内核态堆栈(kernel stack),这是操作系统为了处理中断和系统调用而为每个线程分配的一块内存区域。内核态堆栈中保存了线程执行系统调用或中断时的上下文信息,包括寄存器值、局部...

    linux内核内存分配方式

    ### Linux内核内存分配方式详解 #### 一、引言 Linux内核为了高效地管理内存资源,设计了一系列复杂的机制来处理内存分配与回收。本文将深入探讨Linux内核中的两种主要内存分配策略:伙伴系统算法和slab分配器,并...

    linux内存管理之伙伴系统分析(大内存分配)

    Linux内核的内存管理系统在处理大内存分配时,采用了伙伴系统(Buddy System)算法,这一策略主要用于分配和释放超过单个页面(通常是4KB)的大块内存。伙伴系统的核心思想是将内存按照2的幂次方进行划分,形成不同...

    内存分配器dlmalloc 2.8.3源码浅析.pdf

    ### 内存分配器dlmalloc 2.8.3源码浅析 #### 1. 概述 dlmalloc是一个高效且广泛使用的内存分配器,最初由Doug Lea开发,目前最新的版本为2.8.3。由于其高效性和灵活性,它在Linux系统和其他环境中得到了广泛应用,...

    计算机操作系统内存管理系统可变分区存储管理方式的内存分配回收.doc

    计算机操作系统内存管理系统可变分区存储管理方式的内存分配回收 计算机操作系统的内存管理系统中,存储管理方式是非常重要的一部分。可变分区存储管理方式是一种常用的存储管理方式,它可以根据作业的需求动态地...

    linux内存管理之伙伴系统分析(大内存分配)收集.pdf

    Linux内核的内存管理系统是其高效运行的关键组成部分,特别是在处理大内存分配时。伙伴系统(Buddy System)是Linux内核用于管理大内存分配的主要算法,适用于分配超过一个页面(通常为4KB)的内存块。这个系统的...

    C语言高级编程(含内存分配,绘制图形,结构体等)

    - **静态内存分配**:C语言中的`static`关键字用于声明全局变量和局部变量,它们在程序执行期间始终占据内存空间。 - **动态内存分配**:通过`malloc()`、`calloc()`、`realloc()`和`free()`函数进行。`malloc()`...

    c++:内存分配实现机制

    C++中的内存分配是通过标准库提供的函数,如`malloc`和`free`来实现的。这些函数在底层与操作系统的内存管理机制紧密关联,帮助程序员动态地获取和释放内存。`malloc`函数用于在堆上分配指定大小的内存块,而`free`...

    xml和struct之间的相互转换

    2. **内存分配**:根据XML结构,动态分配内存来创建struct实例。这包括为字符串等可变长度的数据分配内存。 3. **数据填充**:遍历XML解析结果,将元素值赋给struct的相应字段。 4. **struct到XML转换**:这个过程...

    C语言动态分配内存.ppt

    C语言动态内存分配 C语言动态内存分配是指在程序运行时分配内存空间,以满足程序的需求。在某些情况下,程序需要在运行时动态地分配内存,以便存储大量数据或处理不确定大小的数据。例如,在顺序对一批文件进行解析...

    【C语言】C语言内存分配

    例如,将`sizeof(struct student)`误写为`sizeof(struct student*)`,导致内存分配不足。正确的做法是使用`sizeof(struct student)`来确定所需的内存大小。 2. **为指针分配的内存太小** 如果分配的内存不足以...

    C语言动态分配内存ppt课件.ppt

    动态内存分配的基础 在C语言中,动态内存分配是通过malloc函数实现的。malloc函数的原型为void *malloc(size_t n),其中n是要分配的内存的大小,返回值是分配内存的块的首地址。 例如,使用malloc函数分配一个可以...

Global site tag (gtag.js) - Google Analytics