结构体内存对齐

简介: 结构体内存对齐

结构体的对齐规则:

1.结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

 对齐数 = 编译器默认的一个对齐数与该成员变量大小的较小值

 VS 中默认的值为 8

 Linux中 gcc 没有默认对齐数,对齐数就是成员自身的大小

3. 结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的 整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。

//练习1
struct S1
{
  char c1;
  int i;
  char c2;
};
printf("%d\n", sizeof(struct S1));//12

以下以VS分析:

  • char c1:占用1个字节 - 从偏移量为0的地址处开始对齐
  • 填充:3个字节,以确保int i从4的倍数地址开始  - 确保下一个地址的偏移量为4的倍数
  • int i:占用4个字节 - 编译器默认对齐数为8,int类型的大小为4个字节 ,因此该对齐数采用较小的4
  • int i 对齐完后,偏移量为7,下一个偏移量为8,是char类型对齐数的整数倍
  • char c2:占用1个字节  -偏移量为8
  • 到这里结构体占用了9个字节
  • 填充:1个字节,结构体的总大小是最大对齐数的倍数,在这里,最大对齐数为4。结构体目前大小为9,不是4的倍数,填充3个字节,大小为12,是4的整数倍。
  • 所以,struct S1的总大小是1(c1)+ 3(填充)+ 4(i)+ 1(c2)+ 3(填充)= 12字节。

下面给出2个练习,大家动手算算吧。

//练习2
struct S2
{
  char c1;
  char c2;
  int i;
};
printf("%d\n", sizeof(struct S2));//8
//练习3
struct S3
{
  double d;
  char c;
  int i;
};
printf("%d\n", sizeof(struct S3));//16
//练习4-结构体嵌套问题
struct S4
{
  char c1;
  struct S3 s3;
  double d;
};
printf("%d\n", sizeof(struct S4));//32
  • char c1:占用1个字节 - 从偏移量为0的地址处开始对齐
  • struct S3的最大对齐数为8,因此s3应该从偏移量为8的位置开始对齐
  • 填充:7个字节 -- 确保下一个地址的偏移量为8的倍数
  • struct S3 s3:占用16个字节
  • struct S3 s3对齐完后,偏移量为23,下一个偏移量为24,是doubler类型对齐数的整数倍
  • double:占用8个字节  -偏移量为31
  • 到这里结构体占用了32字节,结构体的总大小是最大对齐数(含嵌套结构体成员的对齐数)的倍数,在这里,最大对齐数为8。结构体目前大小为32,是8的倍数
  • 所以,struct S4的总大小是1(c1)+ 7(填充)+ 16(s3)+ 8(d)= 32字节。

节省空间

       在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

       让占用空间小的成员尽量集中在一起

//例如: 
struct S1
{
  char c1;
 
  int i;
 
  char c2;
};
struct S2
{
  char c1;
  char c2;
  int i;
};

修改默认对齐数

#pragma 这个预处理指令,可以改变编译器的默认对齐数。

#include <stdio.h>
#pragma pack(1)//设置默认对⻬数为1
struct S 
{
  char c1; 
  int i; 
  char c2; 
};
#pragma pack()//取消设置的对⻬数,还原为默认
int main()
 
{
  //输出的结果是什么?
  printf("%d\n", sizeof(struct S));
  return 0;
}


目录
相关文章
|
存储 Linux Windows
GPT与MBR:硬盘分区表格式的革新与区别
GPT与MBR:硬盘分区表格式的革新与区别
1886 0
|
存储 Linux
Linux文件的上和下,FinalShell文件右键可下文件,先选择root文件夹,然后把他文件往里面拖动,就可以下载了,命令下载,ls -l可以看当前文件目录,sz 文件名可下载,tab补,rz出上
Linux文件的上和下,FinalShell文件右键可下文件,先选择root文件夹,然后把他文件往里面拖动,就可以下载了,命令下载,ls -l可以看当前文件目录,sz 文件名可下载,tab补,rz出上
|
17天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
12817 76
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
|
5天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
10天前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
1629 2
|
人工智能 JavaScript 开发工具
DeepSeek Harness 本地安装与使用指南
DeepSeek Harness(DSH)是DeepSeek AI开源的Agent运行框架,支持本地文件操作、命令执行与工具调用。基于Cordis插件架构,具备高扩展性与强可控性,适合开发者搭建可控Agent环境或开展模型基准测试。当前为开发者预览版,需Node.js环境,推荐先用`npx @deepseek-ai/dsh web`快速体验。
5009 0
|
12天前
|
人工智能 Java BI
【AI】DeepSeek Harness 安装、运行、管理插件
本文介绍了如何运行DeepSeek开源的Agent框架DeepSeek Harness(dsh)。主要内容包括:使用nvm安装适配的Node版本;通过代理加速克隆GitHub源码;使用pnpm安装依赖并启动项目;配置DeepSeek API Token;安装扩展功能的插件。该框架自带Web界面,支持模型适配、文件编辑等插件化功能
1750 1
|
13天前
|
人工智能 JavaScript 测试技术
保姆级教程:DeepSeek Harness从安装到跑通测试,30分钟上手
DeepSeek Harness是DeepSeek开源的AI Agent运行时,主打“一行命令安装、5分钟跑通”。它让模型真正动手干活——读代码、跑测试、分析失败、生成修复方案。本文手把手教你30分钟从零上手,覆盖安装、配置、实测及避坑指南,助你快速掌握下一代AI编程范式。

热门文章

最新文章