zoukankan      html  css  js  c++  java
  • [转载] 数据结构在内存里的大小与对齐(C语言)

    this is a test file, Sharing and the structure of the memory allocation.
    //Print the data type of the memory size allocated.
    //32-bit processors running in the results and comments should be equal.
    //In the running linux system, the result is different.

    #include <stdio.h>

    //test 1
    union data_1
    {
    double d;    // 8 byte
    int   i;    // 4 byte
    char c1;   // 1 byte
    char c2[9];//9 byte ;由于最大的数据类型是8,共用9字节但要以8字节对齐,整个共用体应该分配16字节内存;
    };

    //test 2
    struct data_2
    {
    double d;    // 8 byte
    int   i;    // 4 byte
    char c1;   // 1 byte
    char c2[9];//9 byte ,实际上c2=9与i=4、c1=1以8对齐是16;所以整个结构体分配的内存大小为8+16=24;
    };

    //test 3
    union data_3
    {
    int   i;    // 4
    char c1;   // 1
    char c2[9];//1*9 = 9,但要以int 4 对齐,实际分配了12字节;整个共用体应该分配12字节内存
    };

    //test 4
    struct data_4
    {
    int   i;    // 4
    char c1;   // 1
    char c2[9];//1*9 = 9, c2=9与i=4、c1=1: 4+1+9=14以4对齐为16
    };

    //test 5
    union data_5
    {
    char c1;   // 1
    char c2[3];// 1*3=3; 共用体共用最大的类型所分配的内存3,以1对齐后还是3;
    };

    //test 6
    struct data_6
    {
    char c1;   // 1
    char c2[2];//1*2=2;结构体实际分配的内存是所有数据类型分配的内存的总和1+2=3,以1对齐为3;
    };

    //test 7
    struct data_7
    {
    char c1;// 1 实际以8对齐c1分配了8字节的内存
    double d; // 8 最大数据类型8
    char c2;//1 和c1一样,也分配了8字节的内存;所以结构体分配的总内存为:8+8+8=24
    };

    //test 8
    struct data_8
    {
    char c1; // 1
    char c2; // 1 实际上和c1以8对齐后c2和c1以8对齐后,共分配了8字节内存
    double d; // 8 所以结构体总分配的内存为8+8=16;
    };

    //test 9
    struct inner_9
    {
    char c1; // 1
    double d; // 8
    char c2; // 1 结构体共分配24字节内存,同data_7
    };
    union data_9
    {
    struct inner_9 t1; // 24
    int i;         // 4
    char c;         // 1 共用24字节内存,以8对齐仍为24字节
    };

    //test 10
    struct inner_10
    {
    char c1;
    double d;
    char c2; //同data_7,分配了24字节
    };
    struct data_10
    {
    struct inner_10 t1; //24
    int i;          //4
    char c;          //1 ,c和i:4+1=5要以inner_10里面的d=8对齐,总分配8字节内存;所以整个结构体分配的内存为24+8=32;
    };

    //test 11
    struct data_11
    {
    int     a; // 4
    long    b; // 4
    double c; // 8
    float   d; // 4
    char    e; // 1
    short   f; // 2 f和e、d:4+1+2=7,以8对齐,共分配了8字节内存以8对齐;所以整个结构体分配的内存为:4+4+8+8=24
    };

    //test 12
    struct data_12
    {
    int     a; //4
    long    b; //4
    double c; //8
    float   d; //4
    char    e[3];//3 e和d:4+3=7,以8对齐,共分配了8字节的内存
    short   f; //2   以8对齐还得分配8字节内存;整个结构体共分配了32字节内存
    };

    //test 13
    typedef union
    {
    long i; // 4
    int k[6]; //4*6=24
    char c; //1 ;共用体分配24字节内存,以4对齐后还是24字节
    }DATA_13;
    struct data_13
    {
    int cat;     //4 ;4要以8对齐,分配8字节
    double dog; //8
    DATA_13 cow; //24 ;结构体以最大基本数据类型8对齐,共分配8+8+24=40
    };
    DATA_13 max;

    int main()
    {
    printf("compare size practice(before ?=) and forecast(back of ?=)\n\n");
    printf("test 1 sizeof(union data_1) = %d ?= 16\n",
    sizeof(union data_1));
    printf("test 2 sizeof(struct data_2) = %d ?= 24\n",
    sizeof(struct data_2));
    printf("test 3 sizeof(union data_3) = %d ?= 12\n",
    sizeof(union data_3));
    printf("test 4 sizeof(struct data_4) = %d ?= 16\n",
    sizeof(struct data_4));
    printf("test 5 sizeof(union data_5) = %d ?= 3\n",
    sizeof(union data_5));
    printf("test 6 sizeof(struct data_6) = %d ?= 3\n",
    sizeof(struct data_6));
    printf("test 7 sizeof(struct data_7) = %d ?= 24\n",
    sizeof(struct data_7));
    printf("test 8 sizeof(struct data_8) = %d ?= 16\n",
    sizeof(struct data_8));
    printf("test 9 sizeof(union data_9) = %d ?= 24\n",
    sizeof(union data_9));
    printf("test 10 sizeof(struct data_10) = %d ?= 32\n",
    sizeof(struct data_10));
    printf("test 11 sizeof(struct data_11) = %d ?= 24\n",
    sizeof(struct data_11));
    printf("test 12 sizeof(struct data_12) = %d ?= 32\n",
    sizeof(struct data_12));
    printf("test 13 sizeof(union data_13)%d+sizeof(struct max)%d = %d ?= 64\n",
    sizeof(struct data_13), sizeof(max), sizeof(struct data_13)+sizeof(max));

    return 0;
    }

    做个快乐的自己。
  • 相关阅读:
    python调webservice和COM接口
    [转]Python存取XML方法简介
    python中json的操作示例
    [转]PictureEx.h和PictureEx.cpp源文件
    WebBrowser中取对应的图片资源
    #pragma section
    python调win32api调整屏幕分辨率
    徐思201771010132《面向对象程序设计(Java)》第十二周学习总结
    徐思/杨玲《面向对象程序设计(Java)》第十一周学习总结
    徐思201771010132《面向对象程序设计(java)》第十周学习总结
  • 原文地址:https://www.cnblogs.com/Jessy/p/1869238.html
Copyright © 2011-2022 走看看