• c语言结构体在内存中存储,字节对齐


    注意:

    出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则:
    (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除;
    (2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
    (3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
    字节对齐第3条准则提及最宽基本类型的概念,所谓基本类型是指像char、short、int、float、double这样的内置数据类型。“数据宽度”就是指其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型
     

    最宽基本成员 double int char 结构体数组等都不是最宽基本成元 //结构体大小必须可以整除最宽基本成员 是最宽基本成员的整数倍

    结构体成员地址-结构体首地址就是偏移量 必须可以整除成员变量

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 //最宽基本成员 double int char 结构体数组等都不是最宽基本成员
     5 //结构体大小必须可以整除最宽基本成员 是最宽基本成员的整数倍
     6 
     7 //结构体成员地址-结构体首地址就是偏移量 必须可以整除成员变量
     8 struct info
     9 {
    10     //规则1结构体变量的大小能够被其最宽基本类型
    11     //成员的大小所整除;
    12     //char c;
    13     //char sh;
    14     //char ch[9];//11
    15 
    16     //最宽的int 4
    17     //char c;//4
    18     //int sh;//4
    19     //char ch[7];//8   //16
    20 
    21     int num;//4
    22     int num2;//4
    23     char c[19];//20
    24 };
    25 void main1()
    26 {
    27     printf("%d",sizeof(struct info));
    28 
    29     getchar();
    30 }
    31 
    32 void main()
    33 {
    34     struct info info11 = {10,200,"1564"};
    35     printf("
    %p",&info11);//0032fc14
    36     printf("
    %p",&info11.num);//0032fc14
    37     printf("
    %p",&info11.num2);//0032fc18
    38     printf("
    %p",&info11.c);//0032fc1c
    39 
    40     getchar();
    41 }
  • 相关阅读:
    十一周总结
    第十周课程总结
    第九周课程总结&实验报告
    第八周课程总结&实验报告
    第七周&实验报告五
    第六周&Java实验报告四
    课程总结
    第十四周课程总结
    第十三周总结
    十二周课程总结
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/6013898.html
Copyright © 2020-2023  润新知