首页 > 系统相关 >cpp结构体的sizeof涉及到的字节对齐问题代码-内存初探

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

时间:2023-04-14 15:36:58浏览次数:37  
标签:cout int double S1 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++,感觉理解又深刻了一些.

标签:cout,int,double,S1,cpp,对齐,sizeof,字节
From: https://blog.51cto.com/u_14011026/6190398

相关文章

  • python 中英文对齐
    python中英文对齐代码defget_len(string:str):length=0forchinstring:if'\u4e00'<=ch<='\u9fa5':#是中文字符length+=2else:length+=1returnlengthdefaligned(string......
  • go语言内存对齐
    go语言内存对齐什么是内存对齐内存对齐,是代码编译后在内存的布局和使用方式。当一个内存地址a是n字节的倍数(其中n是2的幂)时,内存地址a被称为n字节对齐。编译器会将数据按照特定的规则,把数据安排到合适的存储地址上,并占用合适的地址长度比如:存储int32位和int64位的数据时没有......
  • CPP内存管理
    从内核到C++应用整个系统的不同层级有着不同的内存管理器。linux内核:伙伴系统(以页为单位进行管理)、slab分配器(定制化的内存管理器)。malloc\free库函数:使用系统调用mmap、sbrk,以及bins管理多个空闲链表(内存池)。有合并空闲块的操作。有两种方式管理内存:如果分配内存大于mmap......
  • (第八篇)__format__、__hash__、__init_subclass__、__reduce_ex__、__reduce__、__si
    一、__format__(self,format_spec)当我们使用format()方法对一个对象进行格式化时,如果这个对象有__format__方法,那么这个方法就会被调用。它接受一个变量作为参数,并返回一个格式化后的字符串。classPerson:def__init__(self,name,age):self.name=name......
  • cpp: random
     //RandomlySampled.h:此文件包含"RandomlySampled"类。十个常用排序算法C++11//2023年4月9日涂聚文GeovinDuedit.#pragmaonce#ifndefRANDOMLYSAMPLED_H#defineRANDOMLYSAMPLED_H#include<iostream>#include<string>#include<vector&g......
  • C++内存对齐
    0x1什么是内存对齐,为什么需要它?尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,4字节,8字节,16字节甚至32字节为单位来存取内存,这些存取单位称为内存存取粒度。现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能从地址为4......
  • 关于结构体的内存对齐
    今日份学习“结构体的内存对齐”前言:该篇文章主要讲解“结构体”在内存中如何存储?结构体的大小(字节)如何计算?如何更好的创建一个结构体?OK!开始我们的表演你认为的结构体的大小:structs1{ charc1;inta;charc2;};structs2{ charc1;charc2;inta;};structs1......
  • uni-app:nvue:居左/居右/居中对齐(hbuilderx 3.7.3)
    一,代码:居中:<viewstyle="position:fixed;bottom:0;width:750rpx;height:60rpx;display:flex;flex-direction:row;justify-content:center;"><span>{{appName}}version:{{appVersion}}</span></view......
  • cpp shared_future
    #include<chrono>#include<ctime>#include<future>#include<iomainp>#include<iostream>#include<sstream>#include<uuid/uuid.h>std::stringget_time_now(){std::chrono::time_point<std::chrono::high_......
  • cpp: sort Algorithmic
      //TenSortAlgorithms.h:此文件包含"TenSortAlgotrthms"类。十个常用排序算法C++14//2023年4月5日涂聚文GeovinDuedit.#ifndefTENSORTALGORITHMS_H#defineTENSORTALGORITHMS_H#include<vector>//#includedirective#include<string>#include&l......