结构体的简单介绍(3)——结构体的内存对齐

news2025/1/11 20:41:45

目录

结构体的内存对齐:

举例&提出疑问?

 内存对齐:

对齐规则:

偏移数:类似于数组的下标,指的是结构体每个成员的首个地址距离结构体起始位置的距离。

用结构体内存对齐的图例示范:——使用以上文代码进行举例

结构体嵌套的内存对齐 

内存对齐的原因: 

修改默认对齐数 



结构体的内存对齐:

举例&提出疑问?

举例:

struct S1
{
 char c1;
 int i;
 char c2;
};

int main()
{

 printf("%d\n",sizeof(struct S1));
 return 0;

}

以上代码是寻求一个结构体在内存中所占的字节大小。

按照平常的逻辑理论,这里的结构体大小理论上说,应该是六个字节,因为成员c1占一个字节,成员i占四个字节,成员c2占一个字节,所以加在一起一共是6个字节。

但答案真是如此吗?

结果算出的是12个字节。

而后,我又将结构体的成员顺序进行调换,结果还会是12个字节吗?

struct S1
{
 char c1;
 char c2;
 int i;
};

int main()
{

 printf("%d\n",sizeof(struct S1));
 return 0;

}

 通过运算,我们得知,最后得到的是八个字节。

是不是很奇怪,明明成员内容都是一样的,只不过调换了顺序,最后结构体的字节大小却发生了改变,这是为什么?

其实这是和结构体的内存对齐有关!

 

 内存对齐:

对齐规则:

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

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

对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩(变量的字节大小)的较⼩值。

 VS中默认的值为8

Linux中没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩

3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

struct S1
{
 char c1;
 int i;
 char c2;
};

偏移数:类似于数组的下标,指的是结构体每个成员的首个地址距离结构体起始位置的距离。

用结构体内存对齐的图例示范:——使用以上文代码进行举例

 

struct S1
{
 char c1;
 char c2;
 int i;
};

上述代码也是如此:

 

结构体嵌套的内存对齐 

在掌握普通结构体的所占内存和对齐后,那么关于结构体嵌套的对齐值和内存该如何计算呢?

struct S3
{
 double d;
 char c;
 int i;
};

struct S4
{
 char c1;
 struct S3 s3;
 double d;
};
printf("%d\n", sizeof(struct S4));

先求第一个struct S3的所占内存:

 再求struct S4所占的内存:

 

 

 

内存对齐的原因: 

struct S
{
  char c;
  int i;
};

 

假设以上是一段内存,前面一段是不用内存对齐的模式,后面一段是使用内存对齐的模式

二者看似毫无关系,且我们还觉得第二个模式还会浪费内存

但是,内存对齐其实是一种那空间换取时间的操作。

为什么呢?这其实是和编译器的读取有关,vs编译器是32位机器,所以读取字节是一次读四个,而后要当你的结构体第一个成员是char第二个成员是int 时,且不进行对齐那么要读两次内存。

甚至不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定 类型的数据,否则抛出硬件异常。

 

修改默认对齐数 

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct s1
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

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

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

相关文章

【开发】安防监控/视频存储/视频汇聚平台EasyCVR优化播放体验的小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

优化SOCKS5的方法

在今天的互联网世界中&#xff0c;保护个人隐私和提升网络速度至关重要。作为一种常用的代理协议&#xff0c;SOCKS5代理服务器不仅可以保护您的隐私&#xff0c;还可以实现更快速的网络访问。本文将为您介绍一些优化SOCKS5代理服务器的方法&#xff0c;以提高网络速度和安全性…

数据结构例题代码及其讲解-递归与树

树 ​ 树的很多题目中都包含递归的思想 递归 递归包括递归边界以及递归式 即&#xff1a;往下递&#xff0c;往上归 递归写法的特点&#xff1a;写起来代码较短&#xff0c;但是时间复杂度较高 01 利用递归求解 n 的阶乘。 int Func(int n) {if (n 0) {return 1;}else …

看涨期权计算例题(期权案例计算)

看涨期权又称认购期权&#xff0c;买进期权&#xff0c;买方期权&#xff0c;买权&#xff0c;延买期权&#xff0c;或“敲进”&#xff0c;是指期权的购买者拥有在期权合约有效期内按执行价格买进一定数量标的物的权利&#xff0c;下文为大家科普看涨期权计算例题&#xff08;…

【Redis】2、Redis持久化

Redis 高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

【数论】容斥问题教程+符号含义+公式(c++)

容斥问题是什么 比如我们平常考试&#xff0c;我们会统计有几个语文及格&#xff0c;有几个数学及格&#xff0c;比如5个语文及格&#xff0c;2个数学及格&#xff0c;当然了&#xff0c;也会有大学霸两科都及格&#xff0c;比如1个人语文数学都及格&#xff0c;那我们班上一共…

React三属性之:state

作用: state是用于在组件中存储数据,称之为"状态机" 类似于vue2中的data属性,不过操作和vue中data差别很大. 使用: this.state的值不能直接进行赋值操作,如:this.state.value_str 修改的值,需要使用this.setState方法 this.setState({修改的key:修改的value},数…

vue Router从入门到精通

文章目录 介绍使用多级路由实例 路由的query参数传递参数接收参数实例 命名路由作用使用 params参数声明接收params参数传参接收参数实例 props配置实例 router-link的replace属性编程式路由导航作用使用实例 缓存路由组件两个新的生命周期钩子实例 路由守卫作用分类全局守卫独…

软件架构设计(四) 基于服务的架构(SOA)

前面我们了解到了层次架构中表示层的架构分层,分为了MVC,MVP,MVVM等架构风格,下面我们了解一下SOA架构与微服务架构。 什么是服务? 服务是一种为了满足某项业务需求的操作,规则等的逻辑组合,它包含了一系列有序活动的交互,为实现用户目标提供支持。 SOA的起源 前面…

车载网络扫盲

目录 车载以太网发展技术 车载网络通信架构与拓扑 车载网络的车载网关 车载网络通信协议 二层确定性以太网协议 二层车载网络扩展协议 三层安全加密协议 四层应用通信协议 车载网络通信架构的网络安全 车载以太网发展技术 车载网络技术包括车载影音娱乐和车载导航需要的MOST&am…

通用的方法在任何云VM上安装Mikrotik的Cloud Hosted Router

文章目录 1. 创建新的Instance&#xff08;Ubuntu或Debian&#xff0c;理论上任何 linux都可以&#xff09;2. 启动&#xff0c;然后将tempfs挂载到/tmp3. 下载镜像4. 写入镜像文件5.强制重启 通用的方法在任何云VM上安装Mikrotik的Cloud Hosted Router 许多云提供商不允许上传…

海康工业相机:MVC软件安装、官方sdk例子、sdk使用手册、

海康工业相机软件安装 首先下载海康的MVC&#xff0c;官方网址&#xff1a;https://www.hikrobotics.com/cn/machinevision/service/download 直接默认安装&#xff0c;一顿点击下一步&#xff0c;就不说了。 界面如下&#xff1a; sdk官方例子 如果你在windows系统是默认…

网络技术五:IP基本原理

IP基本原理 IP的作用 标识节点和链路 用唯一的IP地址标识每一个节点 用唯一的IP网络号标识每一个链路 寻址和转发 确定节点所在网络的位置&#xff0c;进而确定节点所在的位置 IP路由器选择适当的路径将IP包转发到目的节点 适应各种数据链路 根据链路的MTU对IP包进行分片…

【学习笔记】元学习如何解决计算机视觉少样本学习的问题?

目录 1 计算机视觉少样本学习 2 元学习 3 寻找最优初始参数值方法&#xff1a;MAML 3.1 算法步骤 3.2 代码&#xff1a;使用MAML 和 FO-MAML、任务增强完成Few-shot Classification 4 距离度量方法&#xff1a;Siamese Network,ProtoNet,RN 4.1 孪生网络&#xff08;Sia…

不安全的反序列化(phpjava)及漏洞复现

不安全的反序列化 1. 序列化与反序列化 A8:2017-不安全的反序列化 A08:2021-Software and Data Integrity Failures 为什么要序列化&#xff1f; 序列化&#xff0c;将对象的状态信息转换为可以存储或传输的形式的过程&#xff0c;这种形式大多为字节流、字符串、json 串。…

搭建PyTorch神经网络进行气温预测

import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline features pd.read_csv(temps.csv)#看看数据长什么样子 features.he…

React三属性之:refs

作用 refs是为了获取节点,使用场景主要在需要操作dom的时候,比如echarts,就需要真实的dom节点 使用 import React from "react"; class RefsTest extends React.Component{state {value:输入框的值}refPlan React.createRef()logRef ()>{console.log(this.r…

AlmaLinux 经济收益增加,红帽 RHEL 源码限制不成威胁

导读红帽在两个月前发布公告表示&#xff0c;将限制对 Red Hat Enterprise Linux (RHEL) 源代码的访问&#xff0c;未来 CentOS Stream 将成为公共 RHEL 相关源代码发布的唯一仓库。对于这一决策&#xff0c;AlmaLinux OS Foundation 主席 Benny Vasquez 则向 SiliconANGLE 表示…

线性代数的学习和整理21,向量的模,矩阵的模,矩阵的模和行列式比较(未完成)

目录 1 模的定义 2 向量的模是距离 2.1 向量的模的定义 2.2 向量的模的计算公式 3 矩阵的模 3.1 矩阵/向量组的模的定义 3.2 矩阵的模的公式 4 矩阵的模和行列式的关系&#xff1f; 1 模的定义 模&#xff0c;又称为范数。范数&#xff0c;是具有“长度”概念的函数。…

暖手宝亚马逊美国站UL认证标准要求UL499测试报告

电子产品作为亚马逊平台上较受欢迎的品类之一&#xff0c;得到很多卖家的关注。目前&#xff0c;亚马逊已成为电子产品类零售商No.1。在亚马逊平台上&#xff0c;有18%的卖家出售电子产品。但随着销售该类产品的卖家逐渐增多&#xff0c;平台的审核力度也在加大。进驻亚马逊美国…