当前位置: 首页 > news >正文

数据结构 计算结构体大小

一、规则:

操作系统制定对齐量:

64位操作系统,默认8Byte对齐

32位操作系统,默认4Byte对齐

结构体对齐规则:

1.结构体整体的大小,需要是最大成员对齐量的整数倍

2.结构体中每一个成员的偏移量需要存在其对齐量整数倍的位置

3.成员的对齐量=成员本身的大小<操作系统对齐量?成员本身的大小:操作系统指定对齐量

(若成员大小>8,就取8,若成员大小<8,就取成员大小)

二、数据类型

类型                    所占空间大小

int                              4B

short int                     2B

long int            64: 8B       32:4B

long long                   8B

float                           4B

double                       8B

*p                   64:8B        32:4B

三 、实例(默认都为64位)

1.

typedef struct Test
{int a;  char c;double b;long int p;
}T;

成员对齐量=8B

解析:其中最大的为long int为8B

大小=24B

2.

typedef struct Stu
{char name[5];  int age; char sex; double score; 
}S;   

成员对齐量为:8B

大小=24B

3. 

typedef struct A
{long int a;  short b;    int *p;   float q;  
}A;  

成员对齐量=8

大小=32B

4.

struct C{char b;int a;short c;
};

成员对齐量=4B

解析:结构体最大的是int型,为4B

成员本身的大小<操作系统指定对齐量,4<8,所以成员对齐量=4B

大小=12B

5.结构体嵌套(先计算内部结构体,将内部的结构体对齐,再计算外部)

typedef struct Test{short a;struct {int b;double c;char d;}p;int e;
}Test;

成员对齐量=8B

大小=40B

6.

typedef struct Test {short a;struct {int b;double c[10];char d;};int e;
}Test;

成员变量=8B

大小=112B

7.指定对齐字节(#pragma pack() ,()中只能是2的幂次)

#pragma pack(2)   //指定二字节对齐,()中只能是2的幂次
typedef struct
{char c;  struct A{short a; int *b;  char c; }p;  long b;  int a;  
}T; 
#pragma pack() //取消指定对齐

成员对齐量=2B

大小=26B 

相关文章:

  • Spring Boot 手写starter!!!
  • 第二章、FFmpeg增加RTP协议外部扩展信息解析
  • 蓝桥杯嵌入式第12届真题(完成) STM32G431
  • 内核内存回收关键隐藏变量之page引用计数
  • unity学习(38)——创建(create)角色脚本(panel)--EventSystem
  • 前端不传被删记录的id怎么删除记录,或子表如何删除记录
  • 【深度学习目标检测】十九、基于深度学习的芒果计数分割系统-含数据集、GUI和源码(python,yolov8)
  • 【C语言】详解计算机二级c语言程序题
  • uni-app 经验分享,从入门到离职(四)——页面栈以及页面跳转的 API(开发经验总结)
  • R语言入门笔记2.5
  • AR汽车行业解决方案系列之2-远程汽修
  • 命令行窗口文本复制到 Word 格式保持不变
  • 信息学奥赛一本通1205:汉诺塔问题
  • 接口测试实战--自动化测试流程
  • STM32单片机基本原理与应用(八)
  • 「面试题」如何实现一个圣杯布局?
  • Angular2开发踩坑系列-生产环境编译
  •  D - 粉碎叛乱F - 其他起义
  • extjs4学习之配置
  • FineReport中如何实现自动滚屏效果
  • Idea+maven+scala构建包并在spark on yarn 运行
  • input实现文字超出省略号功能
  • Map集合、散列表、红黑树介绍
  • Swoft 源码剖析 - 代码自动更新机制
  • 前端学习笔记之观察者模式
  • 前端自动化解决方案
  • 区块链分支循环
  • 山寨一个 Promise
  • 使用agvtool更改app version/build
  • 通信类
  • 温故知新之javascript面向对象
  • 想写好前端,先练好内功
  • 栈实现走出迷宫(C++)
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​批处理文件中的errorlevel用法
  • !!Dom4j 学习笔记
  • #Linux(权限管理)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)基于IDEA的JAVA基础1
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)linux下的时间函数使用
  • (转)scrum常见工具列表
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .FileZilla的使用和主动模式被动模式介绍
  • .form文件_一篇文章学会文件上传
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net下的签名与混淆
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国