C语言之字节对齐

news2025/1/13 15:28:21

目录

  • 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.coloradmin.cn/o/2062930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四川正信晟锦:同学借钱不还不回消息

在校园的微风轻拂下&#xff0c;我们彼此以赤诚的心交换着青春的誓言。那些日子里&#xff0c;友情如影随形&#xff0c;金钱在这份单纯中显得微不足道。然而&#xff0c;随着时间的流逝&#xff0c;一桩桩借钱不还的事件悄然滋生&#xff0c;如同夜幕下潜行的阴影&#xff0c;…

bC一体化助力终端动销 单日销量提升5倍

想象一下这样令人振奋的场景&#xff1a;某品牌在短短一天内的销量&#xff0c;竟然达到了过去一周的总销量&#xff01;又或者&#xff0c;一个品牌因其零售店的出色表现&#xff0c;就迅速在一个月内席卷了整个乡镇的所有零售店。 这样的终端动销效果&#xff0c;是否让你心…

AC自动机-2(AhoCorasickDoubleArrayTrie)

Aho-Corasick Double Array Trie (AC DAT) 是一种结合了Aho-Corasick算法和Double Array Trie的数据结构&#xff0c;DAT保证了较高的存储效率&#xff0c;AC保证了多模式字符串匹配效率。 一个经典的实现是hanlp的Java实现&#xff1a;AhoCorasickDoubleArrayTrie。 主要构造过…

2024精选:四款超实用免费视频剪辑软件推荐!

每一位内容创作者都离不开一款好用的视频剪辑软件。今天小编推荐几款实用的视频剪辑免费软件&#xff0c;帮助大家轻松制作出高质量的视频作品&#xff01; 福昕视频剪辑 链接&#xff1a;www.pdf365.cn/foxit-clip/ 福昕视频剪辑的多轨道编辑功能让我在视频制作过程中感到非…

Solidworks 创建工程图纸,工程图纸不显示解决

当完成三维零件&#xff0c;制作工程图纸时&#xff0c;发现右侧“工程图图纸”不显示了&#xff0c;不能像以前那样方便的拖拽了。如下图&#xff1a; 解决办法&#xff1a; 步骤1:点击这 ...&#xff0c;打开需要的三维图文件&#xff0c;如“公头主体” 步骤2&#xff1a;…

选择合适的待办事项软件:用户体验报告

国内外主流的10款好用的待办事项软件对比&#xff1a;1.PingCode&#xff1b;2Worktile&#xff1b;3.微软To Do&#xff1b;4.MeisterTask&#xff1b;5.Airtable&#xff1b;6.Wrike&#xff1b;7.Basecamp&#xff1b;8.ProofHub&#xff1b;&#xff1b;9.嘀嗒清单&#xf…

Jmeter版本下载国内外镜像源

官网最新版本 https://archive.apache.org/dist/jmeter/binaries/历史版本 https://archive.apache.org/dist/jmeter/binaries/ 国内镜像源1.阿里云 https://mirrors.aliyun.com/apache/jmeter/binaries/2.腾讯云 https://mirrors.cloud.tencent.com/apache/jmeter/

汇凯贵金属:金子在家怎么清洗才干净

黄金首饰戴久了&#xff0c;难免会沾染灰尘、油污&#xff0c;失去光泽&#xff0c;影响美观。其实&#xff0c;在家就能轻松清洗黄金&#xff0c;让你的金饰重现光彩! 一、 万能清洁组合 材料&#xff1a; 热开水、牙膏、白醋、食盐、小苏打。 步骤&#xff1a; 将以上材料…

Hive SQL语言

目录 Hive SQL之数据库与建库 create database :创建数据库 use database :选择特定的数据库 drop database :删除数据库 Hive SQL之表与建表 create table : 创建表 分隔符指定语法 Hive SQL-DML-Load加载数据 Load语法功能 语法规则之filepath 语法规则之LOCAL …

【日记】好想换电脑(634 字)

正文 最近连着发了好多高温橙色预警&#xff0c;就算坐在行内都能感觉到明显的闷热。 每次写日记想一想今天都做了些什么&#xff0c;总是觉得什么也没做。上班之后感觉生活十分枯燥。明明学生时代有那么多的事情可以写。 昨天涩得太晚了&#xff0c;2 点钟才睡。今天有些睡眠不…

9年多来 LVFS为Linux系统提供了超过1.1亿个固件文件

本周是红帽公司的理查德-休斯&#xff08;Richard Hughes&#xff09;启动 Linux 厂商固件服务&#xff08;LVFS&#xff09;九年的日子&#xff0c;该服务旨在通过开源的 Fwupd 固件更新工具简化固件更新/分发流程。 在纪念 LVFS 九岁生日之际&#xff0c;Richard Hughes 与大…

快速了解软件测试——测试用例的方法

测试用例的编写方法有八种&#xff0c;其中等价类、边界值、判定表、场景法、流程图重要且使用得多 ●等价类●边界值●判定表●因果图[了解]●正交法[了解]●场景法●流程图●错误推测法[了解] 1、等价类 为什么要用等价类划分法? ●从大量数据中划分范围(等价类),然后从每…

DVWA靶场通关(CSRF)

CSRF 是跨站请求伪造&#xff0c;是指利用受害者尚未失效的身份认证信息&#xff08;cookie、会话等&#xff09;&#xff0c;诱骗其点击恶意链接或者访问包含攻击代码的页面&#xff0c;在受害人不知情的情况下以受害者的身份向&#xff08;身份认证信息所对应的&#xff09;服…

【npm】npm 代理问题

使用electron 打包失败&#xff0c;报如下错误&#xff1a; proxyconnect tcp: dial tcp :0: connectex: The requested address is not valid in its context.解决办法 npm config delete proxy npm config delete https-proxy如果设置了代理&#xff0c;使用以下命令设置 …

手撕⼆叉树——堆

1. 树 1.1 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09; 个有限结点组成⼀个具有层次关系的集合。把它 叫做 树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 • 有⼀个特殊的…

AntSK:在无网络环境中构建你的本地AI知识库的终极指南

亲爱的读者朋友们&#xff0c;我是许泽宇&#xff0c;今天我将深入探讨一个引人注目的开源工具——AntSK。这个工具让您在没有互联网连接的情况下&#xff0c;仍然能够进行人工智能知识库的对话和查询。想象一下&#xff0c;即使身处无网络环境中&#xff0c;您也可以轻松与AI进…

class 1: vue初识

目录 特点Vue.js 2和Vue.js 3优缺点对比Vue.js 2缺点Vue.js 3优点 架构createApp的对象参数template属性data属性methods属性 vue是由Evan You开源的轻量级前端框架&#xff0c;诞生于2014年&#xff0c;Vue.js 3采用MVVM架构&#xff0c;支持声明式编程、组件化开发、前端路由…

【IEEE独立出版】第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…

防火墙iptalbes和firewalld

一、IPtables介绍 Iptables是unix/linux自带的一款开源的基于包过滤(对OSI模型的四层或者是四层以下进行过滤)的防火墙工具&#xff0c;它的功能十分强大&#xff0c;可以对流入和流出服务器的数据包进行很精细的控制。 iptables其实并不是真正的防火墙&#xff0c;我们可以把…

软信天成:国内企业需要什么样的国产主数据管理平台?(三)

在前两期的内容里&#xff0c;我们探讨了当前国内企业使用国产主数据管理平台的紧迫需求&#xff0c;概述了软信自主研发的智能主数据管理平台如何通过“数据建模”、“个性化配置”、“PIM管理”以及“权限管理”四大功能推动企业高效运作。 本期&#xff0c;我们将为您介绍平…