C++的字节对齐

什么是字节对齐

参考什么是字节对齐,为什么要对齐?
现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。
一般而言,Java对象不需要考虑字节对齐,JVM编译时会自动优化。(注:本文中所说的jdk版本是1.8为基础的。)
但C/C++/C#等需要考虑对象次序,避免空间浪费。在c语言中,结构体有字节对齐,c++中的类也有字节对齐。

为什么要内存对齐?

硬件平台限制,内存以字节为单位,不同硬件平台不一定支持任何内存地址的存取,一般可能以双字节、4字节等为单位存取内存,为了保证处理器正确存取数据,需要进行内存对齐。提高CPU内存访问速度,一般处理器的内存存取粒度都是N的整数倍,假如访问N大小的数据,没有进行内存对齐,有可能就需要两次访问才可以读取出数据,而进行内存对齐可以一次性把数据全部读取出来,提高效率。

字节对齐三规则(原文链接):

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

有int double char 三个类型变量的类占多少字节?如何安排能让占字节最小?

在C++中,结构体的字节对齐方式是按照成员变量的自然对齐方式进行的。自然对齐是指变量的起始地址是它自身大小的整数倍。例如,一个int类型的变量需要4字节对齐,而一个double类型的变量需要8字节对齐。

以下是一个示例,其中使用了sizeof()函数来计算三种数据成员(int、double和char)的类字节大小:

#include <iostream>
using namespace std;

class Test {
public:
int a;
double b;
char c;
};

int main() {
cout << "Size of class Test: " << sizeof(Test) << endl;
return 0;
}

输出结果为:

Size of class Test: 24

在这里插入图片描述
24 = 4+4(用于对齐)+8+1+7(用于对齐)

要让Test类在字节对齐后占字节最小,可把double这最长的数据类型放最前或最后。
在这里插入图片描述
16 = 1 + 4 + 3(用于对齐) + 8

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网站项目】课堂教学效果实时评价系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

2024 Python 最新趋势

Python 于 2023 年庆祝其诞生 31 周年。它将成功地完成其在竞技场上的三十年&#xff0c;并成功地与许多其他重要的编程语言进行激烈的竞争。因此很明显&#xff0c;2023 年 Python 对于软件开发人员来说非常重要。 Python 是一种通用、高级、解释性编程语言。如今&#xff0c…

leet hot 100-13 最大子数组和

53. 最大子数组和 原题链接思路代码 原题链接 leet hot 100-10 53. 最大子数组和 思路 生成一个数字来记录last 表示前面数字全部之和与0取最大值 如果大于0 就加上如果不大于0 就不管 从当前位置从新开始遍历计算 时间复杂度O(n) 空间复杂度(1) 代码 class Solution {…

C++——异常机制

目录 一&#xff0c;背景 1.1 C语言处理错误的方式 1.2 C异常概念 二&#xff0c;异常的使用 2.1 异常的简单使用 2.2 异常的匹配原则 2.3 异常抛对象 2.4 异常的重新抛出 2.5 异常安全 三&#xff0c;自定义异常体系 四&#xff0c;异常优缺点 4.1 优点 4.2 缺点 …

女大三抱金砖?看完这篇起诉状就明白:猜疑乃婚姻之大敌

女大三抱金砖&#xff1f;看完这篇起诉状就明白&#xff1a;猜疑乃婚姻之大敌 阿勇与阿芳&#xff0c;一对年过四十的夫妻&#xff0c;且有一对已成年的儿女&#xff0c;如今走到了婚姻的尽头。原告阿勇指控双方感情早已破裂&#xff0c;受父母包办婚姻影响&#xff0c;两人经常…

XL5300(ToF)传感器芯片产品介绍,可最大 4m 的精确距离测量

XL5300 是一款单模块封装 ToF 传感器&#xff0c;采用了 SPAD、TDC 和直方图技术&#xff0c;可实现最大 4000 mm 的精确距离测量&#xff0c;片内集成了单光子雪崩二极管&#xff08;SPAD&#xff09;接收阵列以及VCSEL激光发射器。该传感器可对物体进行精确的距离测量而不受物…

蓝桥杯物联网竞赛_STM32L071_15_ADC/脉冲模块

ADC模块用的是RP1不用多说了&#xff0c;主要是脉冲模块&#xff0c;这个模块没考过 这个脉冲模块放出脉冲&#xff0c;主要能用TIM捕获到这个脉冲的高电平持续时间即可 CubMx配置&#xff1a; 脉冲模块的引脚与PB0相连&#xff0c;所以用PB0读取上升沿记的数和下降沿记的数&am…

视频剪辑软件哪个好?2024会声会影怎么样呢?

随着科技的不断发展&#xff0c;视频制作已经不再是专业人士的专属领域&#xff0c;越来越多的人开始使用各种视频制作软件来记录生活、创作内容。其中&#xff0c;会声会影是被广泛使用的一款视频制作软件&#xff0c;其旗舰版更是备受关注。 视频剪辑软件哪个好&#xff1f;…

信创采购风向标政策!乡镇及以上单位采购台式机/便携式需符合信创要求!

继2023年12月26日财政部会同工业和信息化部研究正式发布7项基础软硬件政府采购需求标准后&#xff0c;信创采购又迎风向标政策&#xff01;从7项基础软硬件政府采购需求标准&#xff0c;看信创采购风向标&#xff01; 2024年3月11日&#xff0c;中央政府采购网发布《关于更新中…

LeetCode-19. 删除链表的倒数第 N 个结点【链表 双指针】

LeetCode-19. 删除链表的倒数第 N 个结点【链表 双指针】 题目描述&#xff1a;解题思路一&#xff1a;双指针解题思路二&#xff1a;优化解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。…

今日头条signature参数js逆向(爬虫)

今日头条是ajax动态加载 话不多说&#xff0c;直接上代码 windowglobal;window.location{"ancestorOrigins": {},"href": "https://www.toutiao.com/","origin": "https://www.toutiao.com","protocol": "…

python基础——模块【模块的介绍,模块的导入,自定义模块,*和__all__,__name__和__main__】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下python基础中的关于模块的导入&#xff1a; 1&#xff0c;模块的介绍 2&#xff0c;模块的导入方式 3&#xff0c;自定义模块 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入门基…

Mediapipe框架(二)人脸检测

Mediapipe框架(二)人脸检测 MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。谷歌的一系列重要产品&#xff0c;如Google Lens、ARCore、Google Home等都已深度整合了 MediaPipe。 MediaPipe目前支持的解决方案(Solution)及支持的平台如下图所示…

得物面试:10wqps高并发,如何防止重复下单?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 10wqps高并发&#xff0c;如何防止重复提交/支付订单&…

基于springboot+vue+微信小程序的医院预约挂号系统(前后端分离)(含参考论文)

基于springbootvue微信小程序的医院预约挂号系统(前后端分离)(含参考论文) 前言 本系统适用于毕业设计、课程设计或者学习等&#xff0c;适合选题&#xff1a;医院预约挂号、微信小程序、前后端分离等。系统采用springbootvue整合开发&#xff0c;前端框架主要使用了element-…

半山腰总是挤的,你得去山顶看看

如果你去爬山&#xff0c;你会发现&#xff0c;半山腰的人总是最多的&#xff0c;越往上走&#xff0c;人越少&#xff0c;而最好的风景你只能到山顶去看。所以如果你想要欣赏到最好的风景&#xff0c;往往付出的努力也最多。爬山不能走捷径&#xff0c;只能你一步一个脚印走上…

块设备的读写框架

生成块设备 我们以虚拟文件的接口&#xff0c;来看这个框架&#xff1b;因为这是从从应用层到内核的必经之路&#xff1b;使用vfs_mknod来生成块设备文件&#xff0c;并初始化fops mknoddo_mknodatvfs_mknodshmem_mknodshmem_get_inodeinit_special_inode void init_special_…

SV学习笔记(三)

类和对象概述 类和对象 面向对象的编程语言更符号人对自然语言的理解&#xff08;属性property和功能function&#xff09;。 这个世界由无数的类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;构成的。 类是将相同的个体抽象出来的描述方式&#xff0c…

【Servlet】thymeleaf快速入门

文章目录 一、thymeleaf介绍二、入门案例 一、thymeleaf介绍 Thymeleaf&#xff1a;视图模板技术 在index.html页面上加载java内存中的fruitList数据&#xff0c;这个过程我们称之为渲染&#xff08;render&#xff09;。 thymeleaf是用来帮助我们做视图渲染的一个技术。 二…

Python学习从0到1 day20 第二阶段 面向对象 ③ 继承

循此苦旅&#xff0c;以达天际 —— 24.4.3 一、继承的基础语法 学习目标&#xff1a; ① 理解继承的概念 ② 掌握继承的使用方式 ③ 掌握pass关键字的作用 单继承 语法&#xff1a; class 类名(父类名): 类内容体 继承分为&#xff1a;单继承和多继承 继承表示&#xff1a;将从…