IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 结构体大小计算 -> 正文阅读

[C++知识库]结构体大小计算

结构体字节大小

不设置对齐方式:
1)无结构体嵌套的情况
结构体的大小为最后一个成员的偏移量+其所占的字节数,除了这个准则外,还需要满足以下的两个原则:
1:结构体中成员的偏移量必须是该成员所在字节数的整数倍。
2:结构体的大小必须为成员中最大基础类型的整数倍
2)有结构体嵌套的情况
需要将嵌套的结构体展开,并且被展开结构体的第一个成员变量的偏移量必须为这个被展开结构体中所占最大字节成员的整数倍。并符合上述1:2:的原则。

#include "stdlib.h"
#include "stdio.h"
typedef struct s1{
    char a[13];//偏移0,占13字节
    int x;//偏移13不是int(4字节)的整数倍,偏移为16,占4字节
}s1;//总计20字节,20即使char(1字节)的倍数,也是int(4字节)的倍数。

typedef struct s2{
    char a[13]; //偏移0,占13字节
    int x; //偏移13不是int(4字节)的整数倍,偏移为16,占4字节
    char b; //偏移量20,是char(1字节)的整数倍,占1字节
}s2; //结果为21字节,按最大基本类型对齐,补充到24字节

typedef struct s3{
    char a[13]; //偏移0,占13字节
    int x;//偏移13不是int(4字节)的整数倍,偏移为16,占4字节
    double b; //偏移量 20字节,不是double(8字节)的整数倍,补充偏移到24字节,占8字节
}s3;//结果为32字节

typedef struct s4{
    char a; //偏移0;占1字节                               =>不考虑对齐,下一成员偏移1字节
    s1 b;//s1中最大基础成员字节4,偏移1+3字节;占20字节     =>不考虑对齐,下一成员偏移24字节
    char f;//偏移24; 占1字节                             =>不考虑对齐,下一成员偏移25字节
    s2 c;//s2中最大基础成员4字节,偏移25+3字节;占24字节    =>不考虑对齐,下一成员偏移52字节
    char g;//偏移52; 占1字节                             =>不考虑对齐,下一成员偏移53字节
    s3 d;//s3中最大基础成员8字节,偏移53+3字节;占32字节    =>不考虑对齐,下一成员偏移88字节
    char e;//偏移88;占1字节
}s4;//共89字节,不能整除sizeof(double),所以补充到96字节

int main()
{
    printf("sizeof s1 is %d \n",sizeof (s1));
    printf("sizeof s2 is %d \n",sizeof (s2));
    printf("sizeof s3 is %d \n",sizeof (s3));
    printf("sizeof s4 is %d \n",sizeof (s4));
    return 1;
}

sizeof s1 is 20
sizeof s2 is 24
sizeof s3 is 32
sizeof s4 is 96

设置对齐方式:#pragma pack(n)
1、如果数据类型得到的对齐方式比n的倍数大,那就按照n的倍数指定的方式来对齐(这体现了开发者可以选择不使用推荐的对齐方式以获得内存 较大的利用率)
2、如果按照数据类型得到的对齐方式比n小,那就按照前者指定的方式来对齐(一般如果不指定对齐方式时,编译器设定的对齐方式会比基本类型的对齐方式大)

#include "stdlib.h"
#include "stdio.h"
#pragma pack(2)
typedef struct s1{
    char a[13];//偏移0,占13字节
    int x;//偏移13不是2字节的整数倍,偏移为14,占4字节
}s1;//总计18字节,18是2的倍数(不需要管int)

typedef struct s2{
    char a[13]; //偏移0,占13字节
    int x; //偏移13不是2字节的整数倍,偏移为14,占4字节
    char b; //偏移量18,是char(1字节)的整数倍,占1字节
}s2; //结果为19字节,按2字节对齐,20字节 

typedef struct s3{
    char a[13]; //偏移0,占13字节
    int x;//偏移13不是2字节的整数倍,偏移为14,占4字节
    double b; //偏移量18,是2字节的整数倍,占8字节
}s3;//结果为26字节

typedef struct s4{
    char a; //偏移0;占1字节                               =>不考虑对齐,下一成员偏移1字节
    s1 b;//2字节对齐,偏移1+1字节;占18字节                 =>不考虑对齐,下一成员偏移20字节
    char f;//偏移20; 占1字节                              =>不考虑对齐,下一成员偏移21字节
    s2 c;//2字节对齐,偏移21+1字节;占20字节                =>不考虑对齐,下一成员偏移42字节
    char g;//偏移42; 占1字节                              =>不考虑对齐,下一成员偏移43字节
    s3 d;//2字节对齐,偏移43+1字节;占26字节                =>不考虑对齐,下一成员偏移70字节
    char e;//偏移70;占1字节
}s4;//共71字节,不能整除2字节,所以补充到72字节

int main()
{
    printf("sizeof s1 is %d \n",sizeof (s1));
    printf("sizeof s2 is %d \n",sizeof (s2));
    printf("sizeof s3 is %d \n",sizeof (s3));
    printf("sizeof s4 is %d \n",sizeof (s4));
    return 1;
}

sizeof s1 is 18
sizeof s2 is 20
sizeof s3 is 26
sizeof s4 is 72

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:19:50  更:2022-03-04 15:21:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:05:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码