美文网首页
C语言中内存对其规则

C语言中内存对其规则

作者: Fan_JinXin | 来源:发表于2020-03-06 14:39 被阅读0次

C语言中结构体内存对齐规则

对齐规则:
  1. 内存偏移为该数据类型的最小整数倍
  2. 总体占用内存为结构体中最大数据类型的整数倍

举个:
首先,要搞清楚每一种数据类型占用内存为多少,在这里,是针对64位Linux(macOs)为例的

NSLog(@"char:%zd",sizeof(char));
NSLog(@"double:%zd",sizeof(double));
NSLog(@"long:%zd",sizeof(long));
NSLog(@"long long:%zd",sizeof(long long));
NSLog(@"char *:%zd",sizeof(char *));
NSLog(@"int:%zd",sizeof(int));
NSLog(@"short:%zd",sizeof(short));

输出结果为:

Test[5517:167810] char:1
Test[5517:167810] double:8
Test[5517:167810] long:8
Test[5517:167810] long long:8
Test[5517:167810] char *:8
Test[5517:167810] int:4
Test[5517:167810] short:2
typedef struct {
    char *a;
    char b;
    char c;
    short e;
    int aa;
    long bbb;
    short dddd;
    struct {
        int ccc;
        short bb;
        char *ee;
    };
    char ddf;
}SL;
分析过程
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"%zd",sizeof(SL));
    }
    return 0;
}

输出结果:

2019-12-15 22:35:17.371774+0800 Test[5079:150310] 56
Program ended with exit code: 0

从这里可以看出,总体占用内存空间为56个字节
分析:

  1. 根据上面占用字节可知: char * a 指针类型占用8个字节
  2. 根据上面占用字节可知:char b占用1个字节,所以,到这里,占用字节数为9
  3. 同2中可知,char c 占用1个字节所以,到这里,占用字节总数为10
  4. 根据上面占用字节可知:short e 占用 2个字节,这里要注意需要对齐2的最小整数倍,在这里,因为已经到了10,正好是2的最小整数倍,所以,从10开始占用2个字节,加起来应该是12个字节
  5. 根据上面占用字节可知:int aa占用4个字节,要对齐4的最小整数倍,12正好是4的整数倍,所以,从12开始占用4个字节,到这里一共占用字节数为16
  6. 根据上面占用字节可知: long bbb 占用8个字节,这里要对齐8的最小整数倍,现在已经是16了,正好是8的整数倍,所以从16开始,占用8个字节,到这里为24
  7. short ddd 占用2个字节,对齐2的整数倍,从24开始占用2个字节,到这里一共占用26
  8. 结构体中分析方法和正常分析方法一个逻辑:int ccc占用4个字节,要对齐4的已占用内存的最小整数倍,4*8 = 32,所以要从32开始占用4个字节,最后为36
  9. short bb,占用2个字节,对齐2的整数倍,从36开始,占用2个字节,最后为38
  10. char * ee 占用8个字节,要对齐8的整数倍,从40开始,占用8个字节,最后为48
  11. 最后一个char ddf,占用1个字节,到这里为49

最后输出结果为什么是56呢,根据上述对齐原则,输出结果为结构体中最大占用字节的整数倍,结构体中最大占用字节为8,现在总占用字节数为49,所以输出为8的整数倍56

相关文章

  • C语言中内存对其规则

    C语言中结构体内存对齐规则 对齐规则: 内存偏移为该数据类型的最小整数倍 总体占用内存为结构体中最大数据类型的整数...

  • 《深入理解计算机系统》——Ch2-MemoryⅡ

    这一章继续学习内存。如何把C语言的变量存到内存,C语言中的指针和数组在内存的存取方式。 1 C语言中的&和* 第一...

  • C语言-用指针实现内存动态分配

    动态存储分配函数 在C语言中,动态分配内存是通过动态存储分配函数 malloc() 来实现的,其功能是: 在内存的...

  • OC内存对其规则详解

    这是一个简单的结构体 输出为: 先看一下对其规则 1.数据成员对⻬规则:结构(struct)(或联合(union)...

  • ArrayList源码分析

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。...

  • ArrayList解析

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。...

  • 02、ArrayList源码分析

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。...

  • C++ new 和 delete 运算符

    在 C 语言中,动态分配内存用 malloc () 函数,释放内存用 free () 函数。如下所示: 在 C++...

  • 3.C语言的变量、基本数据类型及运算符

    内存如何存放数据: 变量:计算机中一块特定的内存空间,由一个或多个连续的字节组成 变量命名规则: C语言中的基本数...

  • Redis源码:内存管理与事件处理

    Redis内存管理 Redis内存管理相关文件为zmalloc.c/zmalloc.h,其只是对C中内存管理函数做...

网友评论

      本文标题:C语言中内存对其规则

      本文链接:https://www.haomeiwen.com/subject/dhsirhtx.html