struct结构体占内存字节数

2023-11-16

 

昨天写了一个结构体demo,心血来潮打印struct所占内存字节数

struct student{
    char name[20];
    char sex;
    int num;
    float score[3];
    void print();
};

你猜猜是多少个字节数呢(对于char[]这样的赋值,先暂且不提)

 struct student stu1 = {"Bob",'M',001,100,100,100};
 cout<< sizeof(stu1 )<<endl;
sizeof(stu1):40

没想到吧。多出来的3个字节是哪里的。

struct student{
    char name[20];//开辟3个8位,char[20],占20位,还剩4位
    char sex;//char占4位中的1位
    int num;//剩下的3位,无法满足长度,新开一个8位,占4位
    float score[3];//剩下4位,float 占4位,3个float占12位,再开一个8位,刚好24+8+8=40
    void print();
};

实际上第二个char型成员虽然本来只有1个字节,但实际上却占用掉了4个字节,因为结构体中空间最大的类型是int,所以整个结构体按4字节对齐。

如果换成是double,结构体中空间最大的类型是double,整个结构体按8字节对齐。

struct student{
    char name[20];//开辟3个8位,char[20],占20位,还剩4位
    char sex;//char占4位中的1位
    int num;//剩下的3位,无法满足长度,新开一个8位,占4位
    double score[3];//剩下4位无法满足长度,double占8位,再开3个8位,刚好24+8+24=56
    void print();
};
sizeof(stu1):56

而#pragma pack(1)让编译器将结构体数据强制连续排列。结果就是37。

#pragma pack(1)//强制1字节对齐,也就是连续排列
struct student{
    char name[20];
    char sex;
    int num;
    float score[3];
    void print();
};
sizeof(stu1):37

 

我们再来看一个实例

typedef  struct{
	int x5; //开辟第1个8位,占据前4位
	double x6;//剩下4位无法满足,开辟第2个8位,刚好用完
	char x7;//开辟第3个8位,占据1位。其余为对齐占位,总计3*8=24位
}x;
sizeof(x):24

我们把char移到前面的位置去,结果又不一样。

typedef  struct{
    char x7;//开辟第1个8位,占据1位
	int x5; //剩下7位,int占据4位
	double x6;//剩下3位无法满足,开辟第2个8位,刚好用完.
}x;
sizeof(x):16
typedef  struct{
    char x7;//开辟第1个8位,占据1位
	int x5; //剩下7位,int占据4位
    float x6;//剩下3位无法满足,开辟第2个8位,只要用掉4位就好,因为这个结构体最大类型是占4个字节.所以结果是12
}x;
sizeof(x):12

相信看完这几个实例,你已经对结构体占内存字节数已有所了解。

总结:

结构体中数据所占字节会按最大的类型所占内存字节对齐。可以使用#pragma pack(1)让编译器将结构体数据强制连续排列,#pragma pack(n)想让它按几个字节排列都可以。

我们再来看一个实例

typedef struct X{
    int i1,i2,i3,i4,i5;
    struct X *next;
}*pX;
int main(void)
{
    pX p_new = NULL;
    cout<< sizeof(p_new->next)<<endl;
    cout<< sizeof(pX)<<endl;
    cout<< sizeof(X)<<endl;
    return 0;
}

结果是:

8
8
32

指针占用内存字节数是8,因为我电脑是64位。如果是在32位系统中,指针是占用4个字节的。

前面5个int型数据,占用20个字节,3个8位,一共24个位,剩下4个位,无法满足指针占用的长度,需要按照struct最大类型8字节对齐,所以是再开一个8位,也就是一起32位。如果代码前面规定#pragma pack(4),这个时候,结果就是28位了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

struct结构体占内存字节数 的相关文章

随机推荐

  • Windows系统下zookeeper启动报错JAVA_HOME is incorrectly set

    最近在Windows系统下 下载了zookeeper 3 5 2 alpha这个版本的zookeeper 把配置文件zoo example cfg重命名为zoo cfg后 直接双击zkServer cmd文件启动结果命令行窗口闪一下就消失了
  • ssh:could not resolve hostname XXX:Temporary failure in name resolution

    ssh could not resolve hostname XXX Temporary failure in name resolution 这个有两种解决办法 1 在 etc profile 中添加如下信息 export HADOOP
  • SDN应用场景实践--指定业务带宽保障

    SDN应用场景实践 指定业务带宽保障 温州大学 12网络工程 欢迎转载 转载请注明出处 谢谢 目录 第一章 背景介绍 2 1 1实验背景
  • 10 linux系统中的日志管理

    10 linux系统中的日志管理 1 journald 服务名称 systemd journald service journalctl 默认日志存放路径 run log journalctl命令的用法 journalctl n 3 日志的
  • python快速实现简易双重弹力球小游戏

    完整代码如下 from tkinter import import random import time Creating the window window Tk window title Bounce window geometry 6
  • STM32HAL 移植MultiButton小巧简单事件驱动型按键驱动框架(裸机版本)

    目录 概述 一 使用方法 特性 按键事件 Examples 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32移植 MultiButton开源框架 引用官网简述如下 Multi
  • 日志审计-syslog日志外发

    一 Linux 主机日志 不同的 Linux 版本 syslog 服务名可能为 syslog 也可能为 rsyslog 以下以 syslog 为例说明 Linux 主机所有的日志文件一般都在 var log 下 默认只是不记录 FTP 的
  • antdpro5.2.0项目开卷

    一 下载antdpro antdpro官网 刚开始想的是去github上下载项目 发现下载出来的版本是6 0 0版本 安装完依赖启动项目 左侧的菜单不出来 用react developer tools工具看 是因为左侧的菜单没有渲染出来 身
  • R语言第十一讲 决策树与随机森林

    概念 决策树主要有树的回归和分类方法 这些方法主要根据分层和分割 的方式将预测变量空间划分为一系列简单区域 对某个给定待预测的观 测值 用它所属区域中训练集的平均值或众数对其进行预测 基于树的方法简便且易于解释 但预测准确性通常较低 如图所
  • Mybatis之choose (when, otherwise)标签

    choose when otherwise 标签 有时候我们并不想应用所有的条件 而只是想从多个选项中选择一个 而使用if标签时 只要test中的表达式为 true 就会执行 if 标签中的条件 MyBatis 提供了 choose 元素
  • idea 导出文件附带文件目录结构

    安装这个插件
  • Linux学习记录之命令

    1 显示 跳转行号的基本操作 vi 文件名 打开文件后 如果要显示所有行号 使用 set nu 如果要显示当前行号 使用 nu 如果要跳转到指定行 使用 行号 例如 跳转到第10行 使用 10
  • OpenPie上榜2022年源自中国值得关注的20家新锐全球化科技品牌

    2022年6月25日 EqualOcean盘点了2022年源自中国值得关注的20家新锐全球化科技品牌 拓数派 OpenPie 成为了数据计算领域领先全球的佼佼者 OpenPie是以 Data Computing for New Discov
  • 1.3 OC与OD门(硬件基础系列)

    针对设计过程的问题 欢迎各位留言评论或群内讨论 1 3 OC与OD门 1 3 1 简介 OC Open Collector 门又叫集电极开路门 主要针对的是BJT电路 图1 21 OC门 OD Open Drain 门又叫漏极开路门 主要针
  • express中简单的使用token

    首先安装需要的插件 创建一个js文件 导入express const exprss require express 创建web服务器 const app exprss 生成token const jwt require jsonwebtok
  • 35道SpringBoot面试题及答案

    Spring Boot 是微服务中最好的 Java 框架 我们建议你能够成为一名 Spring Boot 的专家 本文精选了三十五个常见的Spring Boot知识点 祝你一臂之力 问题一 Spring Boot Spring MVC 和
  • AODV按需路由协议

    一 详细解释 AODV Ad hoc On demand Distance Vector Routing 是一种按需路由协议 当一个节点需要给网络中的其他节点传送信息时 如果没有到达目标节点的路由 则必须先以多播的形式发出RREQ 路由请求
  • Windows Server 2008多路径 I/O 概述

    面向高可用性的多路径支持 Windows Server 2008 包括许多将运行 Windows 服务器级操作系统的计算机与存储区域网络 SAN 设备连接起来的增强功能 集成的多路径 I O MPIO 支持是为基于 Windows 的服务器
  • 升专家需要具备的6个能力!

    阅读本文大概需要2min 文 强哥 图 强哥 未经授权禁止转载 高级开发和初级开发的区别并不只有工作经验的差异 可以说如果只凭经验丰富 那还不够高级开发的标准 互联网企业一般对于技术岗都有清晰的晋升体系和对应的能力图谱 有些人可能因为某些原
  • struct结构体占内存字节数

    昨天写了一个结构体demo 心血来潮打印struct所占内存字节数 struct student char name 20 char sex int num float score 3 void print 你猜猜是多少个字节数呢 对于ch