cpp结构体的sizeof涉及到的字节对齐问题代码-内存初探

#include <iostream>
using namespace std;


int main()
{
    struct S1
    {
        char a; //占8个,因为要和double对齐
        double b;   //占8个字节
    };
    cout << sizeof(S1) << endl; //16   
    /*内存地址排列方式
    [00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15]
    [ a,--,--,--,--,--,--,--,b______________________]
    */

    struct S2
    {
        char a;
        int b;  //a和b总共占8个(因为1 + 4 = 5 小于sizeof(double)=8)要和double对齐.
        double c;   //占8个字节
    };
    cout << sizeof(S2) << endl; //16
    /*内存地址排列方式
    [00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15]
    [ a,--,--,--,b__________,c______________________]
    */

    struct S3
    {
        char a;
        char d;
        int b;  //a,d和b总共占8个(因为1 + 1 + 4 = 6 小于sizeof(double)=8)要和double对齐.
        double c;   //占8个字节
    };
    cout << sizeof(S3) << endl; //16
    /*内存地址排列方式
    [00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15]
    [ a, d,--,--,b__________,c______________________]
    */


    //难点!!!
    struct S4
    {
        char a;
        int b;  //a和b总共占8个(因为1 + 4 = 5 小于sizeof(double)=8)要和double对齐.
        double c;   //占8个字节
        char d;     //因为要和double对齐,占8个字节
    };
    cout << sizeof(S4) << endl; //24
    /*内存地址排列方式
    [00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
    [ a,--,--,--,b__________,c______________________, d,--,--,--,--,--,--,--]
    */

    //难点!!!
    struct S5
    {
        char a;
        int b;  //a和b总共占8个(因为1 + 4 = 5 小于sizeof(double)=8)要和double对齐.
        char e; //e 要单独占8个,因为没有空余1个字节位置可以给他
        double c;   //占8个字节
        char d;     //因为要和double对齐,占8个字节
    };
    cout << sizeof(S5) << endl; //32
    /*内存地址排列方式
    [00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
    [ a,--,--,--,b__________, e,--,--,--,--,--,--,--,c______________________, d,--,--,--,--,--,--,--]
    */

    return 0;
}

有汇编(内存地址)的知识后,重新回来看c++,感觉理解又深刻了一些.

猜你喜欢

转载自blog.csdn.net/xiao_yi_xiao/article/details/121164672