C语言之字节对齐

目录

  • 1. 引言
  • 2.字节对齐原理
  • 3.字节对齐应用
  • 4.总结

1. 引言

字节对齐属于编译器的内容,决定数据实际的存放方式。主要有两个作用:1.优化数据储存,减少空间浪费 2.增加数据读取速率,本文将于以上两点展开,简述字节对齐的原理以及应用

本文参考以下链接: 什么是字节对齐,为什么要对齐?

2.字节对齐原理

几个原则与基本概念:
1.对于32位的CPU只能从4的整数倍地址读取数据,这是硬件设计上为了最大化性能而确定的(同时并行读取32位数据)
链接: 到底为什么要内存对齐?
3.编译器遵循自然对齐原则,即为声明对齐数据,存放在4的整数倍地址(不同平台有所差异)
2.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
3.结构体的自身对齐值:其成员中自身对齐值最大的那个值。
4.指定对齐值:#pragma pack (value)时的指定对齐值value。
5.数据成员和结构体的有效对齐值:数据成员(数据类型)和数据结构的自身对齐值和指定对齐值中小的那个值。(数据成员对齐了数据结构自然也就对齐了)
6.有效对齐值最终用来决定数据地址的存放方式,有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0"
7.编译器对于结构体遵循圆整规则,即总大小%结构体有效对齐值 = 0,向上取整;

未字节对齐结构体示例:

#include 
<stdio.h>
struct C
{char b;int    a;short c;
};int main(int argc, char **argv) {char Byte_Num;Byte_Num = sizeof(struct C);printf("Size is %d \n",Byte_Num);
}

在这里插入图片描述

其中由于未声明字节对齐方式,采用自然对齐存放数据(32位系统)即指定对齐值为4,存放结果如下图
在这里插入图片描述
其中,

  • b自身对齐值为1,而指定对齐值为4,则有效对齐值为1,0x0000_0000%1 = 0,则起始存放地址为0x0000_0000;
  • a自身对齐值为4,而指定对齐值为4,则有效对齐值为4,0x0000_0004%4 = 0,则起始存放地址为0x0000_0004;
  • c自身对齐值2,而指定对齐值为4,则有效对齐值为2,0x0000_0008%4 = 0,则起始存放地址为0x0000_0008;
  • 结构体C自身对齐值为4,而指定对齐值为4,则有效对齐值为4,0x0000_0000至0x0000_0008共9byte,根据圆整规则,9+2%4 = 0,则结构体总大小为12byte;
    字节对齐结构体示例:
#include <stdio.h>
#pragma pack (2) /*指定按2字节对齐*/
struct C
{char b;int    a;short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/int main(int argc, char **argv) {char Byte_Num;Byte_Num = sizeof(struct C);printf("Size is %d \n",Byte_Num);
}

在这里插入图片描述

在这里插入图片描述

其中,

  • b自身对齐值为1,而指定对齐值为2,则有效对齐值为1,0x0000_0000%1 = 0,则起始存放地址为0x0000_0000;
  • a自身对齐值为4,而指定对齐值为4,则有效对齐值为4,0x0000_0004%4 = 0,则起始存放地址为0x0000_0002;
  • c自身对齐值2,而指定对齐值为4,则有效对齐值为2,0x0000_0008%4 = 0,则起始存放地址为0x0000_0006;
  • 结构体C自身对齐值为4,而指定对齐值为4,则有效对齐值为4,0x0000_0000至0x0000_0007共8byte,根据圆整规则,8%4 = 0,则结构体总大小为8byte;

3.字节对齐应用

有了以上基础,在代码中定义变量是为了提高寻址效率以及节省空间可以遵循以下原则进行:
1.变量定义顺序按字节大小顺序排列
2.结构体定义大小使用圆整规则尽量避免编译器填充

4.总结

本文为博主个人学习总结记录,如有不正,欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406254.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VLM调研记录

Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction 北大和字节团队的一篇VLM&#xff0c;在生成任务上&#xff0c;用GPT范式&#xff0c;声称在FID上超过了DIT&#xff0c;SD3和SORA。开源。首先是multi-scale的VQVAE&#xff0c;然后是…

一起学习LeetCode热题100道(52/100)

52.腐烂的橘子(学习) 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返…

PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码

&#x1f680;轻创推客&#xff0c;营销新纪元 —— 集淘客与地推任务于一体的全能平台&#x1f310; &#x1f308;【开篇&#xff1a;营销新潮流&#xff0c;轻创推客引领未来】 在瞬息万变的营销世界里&#xff0c;你还在为寻找高效、全面的营销渠道而烦恼吗&#xff1f;&…

【数据安全】数据中心数据安全整体解决方案(Doc完整版)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏…

图数据库查询语言 Cypher 基础

Cypher 是 Neo4j 的声明式查询语言&#xff0c;为属性图提供了富有表现力和高效的查询&#xff0c;是一种成熟和直观的图数据库查询语言。在图上执行任何类型的创建、读取、更新或删除(CRUD)&#xff0c;Cypher 是 Neo4j 的主要接口。 本文介绍了 Cypher 基础知识&#xff0c;…

软件测试用例的编写(六)

软件测试用例 定义 测试用例&#xff08;TestCase&#xff09;是为项目需求而编制的一组测试输入&#xff0c;执行步骤&#xff0c;以及预期结果&#xff0c;以便测试某个程序是否满足客户需求 可以总结为&#xff1a;每一个测试点的数据设计和步骤设计 – 对测试点的细化 作…

大数据技术之Zookeeper安装 (2)

目录 下载地址 本地模式安装 1&#xff09;安装前准备 2&#xff09;配置修改 3&#xff09;操作 Zookeeper 配置参数解读 Zookeeper 集群操作 集群规划 解压安装 配置服务器编号 配置 zoo.cfg 文件 集群操作 Zookeeper 集群启动停止脚本 创建脚本 增加脚本执行权限 …

在线问诊平台开发指南:基于互联网医院系统源码的实现路径

今天&#xff0c;小编将详细讲解如何通过互联网医院系统源码开发在线问诊平台。 一、在线问诊平台的需求分析 在线问诊平的核心目标是通过互联网技术&#xff0c;实现患者与医生之间的远程交流与诊断。因此&#xff0c;在开发过程中&#xff0c;首先需要明确平台的核心功能需求…

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …

SpringBoot笔记01

第1章 Spring Boot概要 1.1 SpringBoot介绍 随着动态语言的流行&#xff08;Ruby、Scala、Node.js&#xff09;, Java的开发显得格外的笨重&#xff1b;繁多的配置、低下的开 发效率、复杂的部署流程以及第三方技术整合难度大。 在上述环境下&#xff0c;Spring Boot由此诞生…

光伏检测气象站:实时监测:高效管理

随着全球对可再生能源需求的日益增长&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;其重要性日益凸显。然而&#xff0c;光伏发电的效率与稳定性受气象条件影响显著&#xff0c;如光照强度、温度、湿度、风速等因素均能直接影响光伏板的发电效率。因此&#xff0…

巧用PDF转Markdown插件,在扣子(Coze)手搓一个有趣好玩的AI Bot

近期&#xff0c;TextIn团队开发的PDF转Markdown插件已经上架Coze平台。 短短的时间内&#xff0c;已经有不少朋友愉快地和我们的工具开始玩耍。今天我们抛砖引玉&#xff0c;介&#xff08;an&#xff09;绍&#xff08;li&#xff09;几种PDF转Markdown插件的有趣玩法&#…

阅读、分析和维护高质量开源软件有感——小计一笔

目录 一、问题分析 软件开发问题分析 动机 学什么 目的 二、要求 阅读 理解 运用 分析 评估 认知 三、案例选择 MiNotes”开源软件 方式 实践支撑软件工具 操作流程 应该学到的知识 学习过程 四、任务与输出 1.阅读开源软件 2.标注开源软件 3.分析开源…

路径规划 | 灰狼算法+B样条曲线优化无人机三维路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 灰狼算法B样条曲线优化无人机三维路径规划&#xff08;Matlab&#xff09; 群智能路径规划算法。三维灰狼算法&#xff08;GWO&#xff09;加B样条曲线优化的matlab代码。无人机&#xff08;UAV&#xff09;路径规划…

二叉树剪枝

1、题目解析 2、算法解析 本题使用二叉树的后序遍历&#xff0c;通过递归函数将左右子树进行处理&#xff0c;得到处理结果后&#xff0c;判断左右结果以及自身的val判断是否需要剪枝。 3、代码编写 class Solution { public:TreeNode* pruneTree(TreeNode* root) {if(root …

SpringBoot项目多线程实现定时任务-只需要三步

众所周知&#xff0c;项目中需要使用定时任务发布的需求时非常常见的&#xff0c;例如&#xff1a;数据同步&#xff0c;清理垃圾文件&#xff0c;清理过期用户等需求&#xff0c;可能需要我们定时去清理数据。 但是我们如果集成xxl-job&#xff0c;Quartz&#xff0c;spring …

Leetcode每日刷题之1004.最大连续1的个数|||(C++)

1.题目解析 本题的目的是找出能最多翻转k个0的情况下最长连续的1的个数&#xff0c;并且这是一个二进制数组&#xff0c;只存在0和1&#xff0c;翻转0就是将0变为1 2.算法原理 首先我们想到的一定是暴力枚举&#xff0c;即依次列举出在最多翻转k个0的情况下所有连续1的子数组的…

odoo17 网站内容存在哪了

odoo17 网站内容存在哪了 查数据库内容&#xff0c;却没找到 没理解这些内容到底存在了哪里呢

从0-1建一个webpack/vue项目,熟悉一下webpack知识点

以下配置项部分优化来自于国内直连GPT/Claude 第一步 首先整个新文件夹&#xff0c;打开终端&#xff0c;然后创建一个新目录&#xff0c;或者直接在vscode里面建个新文件夹&#xff0c;并进入该目录&#xff1b; mkdir my-vue-webpack-project第二步 进入当前目录 cd my-v…

JavaSE基础(11)——java.util包

目录 1、Random 创建Random对象 方法 2、Date类 创建Date对象 3、Canlender类 创建Calendar类对象 方法 4、java.text.SimpleDateFormat类 创建SimpleDateFormat对象 方法 SimpleDateFormat格式规范 5、java.time包 java.time包含的主要类 方法分类 1、Rando…