C++中的内存对齐

零基础DSP实战TMS320F28035:第九节,ADC比较器&EPWM ADC比较器框图如下所示:-电压-----------------------------输出-电压A>电压B------------------ 1-电压A 阅读详情

C++的一道题

#include "iostream"
#include "string"
using namespace std;
//#pragma pack(1)   
struct student
{
	char  name[17];
	double j;
	char sex;
	char g;
	char h;
	    
}stu;

struct s
{
	char name[10];
	int age;
	int num;
	int a;
	char m;	    
}s;

void main(){
	cout << "stu:"<< sizeof(stu) <<endl;
	cout << "s:" << sizeof(s) << endl;
}


首先看看windows平台下微软C编译器的相关内存对齐的规则:
  1) 结构体变量的首地址是其最长基本类型成员的整数倍;

  备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能是该基本数据类型的整倍的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。

  2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

  备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。

  3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。

  备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。

  4) 结构体内类型相同的连续元素将在连续的空间内,和数组一样。

  5) 如果结构体内,存在长度大于处理器位数的元素,那么就以处理器的倍数为对齐单位;否则,如果结构体内的元素的长度都小于处理器位数的时候,便以结构体里面最长的数据元素为对齐单位。
再看如何对齐并且计算结构体或者联合体长度:
  1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
  2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

  3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

了解这些后我们来看看上面这个题目
首先这个结构体中最长的数据类型为int类型,在32位windows平台下int类型为4个字节,故本例子中结构体以4个字节对齐。
数据成员的对齐
struct student
{
char name[10]; // char类型为1个字节,小于4个字节,按1字节对齐,存放在【0,9】
int age; // 按4字节对齐,因为目前偏移量不能满足是4的倍数,故需要填充2个字节,存放在【12,15】
int num; //4字节对齐,存放在【16,19】
int a; //4字节对齐,存放在【20,23】
char m; //1字节对齐,存放在【24】
}stu;
结构体对齐:
最后的偏移地址25不是4的倍数,填充3个字节后,满足条件。
故该结构体长度为28


另外需要注意的是每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
通过该预编译命令指定的对齐系数不需要上面的规则来判断对齐系数。


纯方位观测下的三维定位,IV-PLKF(Inverse Velocity-Weighted Pseudo-Linear Kalman Filter) 在现代定位系统中,纯方位观测因其无需测距设备的优势,在无线通信、无人机导航和室内定位等领域备受关注。本文深入探讨基于算法的三维定位方法,并提供完整的MATLAB仿真例程。 阅读详情

相关推荐

UE5 AI寻路全攻略:从Nav Mesh基础到动态障碍与多模式导航

在游戏开发中,AI寻路是赋予非玩家角色自主移动能力的关键技术。其核心原理是通过预计算或实时生成一个表示可行走区域的导航网格,AI路径查找算法(如A*)在此网格上规划最优路径。这项技术的价值在于,它能极大提升游戏世界的真实感和交互性,使NPC能够智能地绕开障碍、穿越复杂地形,广泛应用于开放世界、RPG、策略游戏等多种场景。本文聚焦于虚幻引擎5的寻路系统,深入探讨其寻路网格体配置。针对动态环境挑战,文章详细介绍了如何利用寻路修饰体积和动态障碍物组件实现导航网格的实时更新;同时,针对游泳、飞行等特殊移动需求,解析

weixin_33226816的博客 360

geoserver在tomcat上开启不了服务的原因

排除了JDK版本原因和geoserver版本原因,最终确定是tomcat版本的问题 之前用的最新版本的tomcat10,改成tomcat9之后顺利开启服务。 注意:tomcat8也不行,目前8、9、10版本只有9能用geoserver

liguanzeng的博客 3293

手把手教你学Simulink--双足机器人分数阶PID控制仿真

分数阶PID(Fractional-order PID, FOPID)控制是一种先进的控制策略,它扩展了传统的整数阶PID控制器的概念。FOPID控制器允许积分和微分项的阶次不是严格的整数,而是可以是任意实数,这为系统提供了更多的设计自由度,并可能带来更好的性能。在双足机器人控制中,分数阶PID控制可以用于改善机器人的平衡控制、轨迹跟踪等任务的性能。下面我们将详细介绍如何使用Simulink进行基于分数阶PID控制方法的双足机器人仿真研究。

MHD0815的博客 880

【C/C++学习笔记】C++11 新特性之内存对齐

举个例子介绍下内存对齐,又 #include <iostream> struct A { int a; short b; char c; double d; }; struct B { int a; char b; short c; double d; }; struct C { char a; int b; double c; short d; }; int main() { prin

hallyz的博客 2012

AgentFlow:模块化智能体框架与Flow-GRPO强化学习实战解析

在人工智能领域,大语言模型(LLM)与智能体(Agent)技术正推动着自动化任务处理的发展。其核心原理在于通过规划、执行与反馈的循环,使AI系统能够自主调用工具解决复杂问题。这一技术的价值在于突破单一模型的局限性,实现更可靠的多步骤推理。在实际应用中,智能体框架需要处理搜索、代码执行、数学计算等多种场景。本文聚焦的AgentFlow框架,正是通过模块化设计将智能体拆分为规划者、执行者、验证者和生成者四个专家模块,并引入Flow-GRPO强化学习算法进行流程内优化。该框架在搜索增强与工具调用等任务上展现出显著

weixin_42311427的博客 367

遥感目标检测数据集汇总

文章目录1. 光学数据集1.1 DIOR1.2 LEVIR1.3 DOTA1.4 RSOD1.5 NWPU VHR-101.6 VEDAI1.7 COWC1.8 ITCVD1.9 DIUx xView 20181.10 HRSC20161.11 TAS1.12 SZTAKI‐INRIA1.13 UCAS AOD1.14 DLR 3K Vehicle2. SAR2.1 SSDD2.2 SSDD+2....

quanwei的博客 6万+

超级简单的快排(java版)

思想 (分治) 1.确定分界点 (可以是arr[l] , arr[r] , arr[(l+r)/2] , 也可以是随机的) 2.(调整区间)通过分界点确定区间,是左边的数都小于分界点,右边的数都大于分界点 3.递归处理左右两端 详解 如何调整区间: 未优化前: 优化操作: 模板 在这里插入代码片 ...

qq_44791484的博客 472

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

使用Python、Selenium实现问卷星自动填写,内含适配个人问卷的方法。

DaenCode的博客 3837

c++11新特性之内存对齐

什么是内存对齐? 理论上计算机对于任何变量的访问都可以从任意位置开始,然而实际上系统会对这些变量的存放地址有限制,通常将变量首地址设为某个数N的倍数,这就是内存对齐。 为什么要内存对齐? 硬件平台限制,内存以字节为单位,不同硬件平台不一定支持任何内存地址的存取,一般可能以双字节、4字节等为单位存取内存,为了保证处理器正确存取数据,需要进行内存对齐。 提高CPU内存访问速度,一般处理器的内存存取粒度都是N的整数倍,假如访问N大小的数据,没有进行内存对齐,有可能就需要两次访问才可以读取出数据,而进行内存

qq_29426201的博客 1641

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3109

【ComfyUI】Flux 图像扩展

本文介绍了一个基于Flux扩图技术的ComfyUI工作流,能够智能扩展图像尺寸并保持内容连贯性。该流程通过扩散模型与条件编码的结合,对图像边缘进行语义填充生成,适用于艺术创作、海报设计等场景。工作流包含图像加载、外扩填充、文本编码、扩散采样等核心节点,采用Flux1-fill-dev等专业模型确保生成质量。演示效果显示,系统能自然延伸原图内容,保持风格统一。该技术可广泛应用于插画扩展、摄影增强、游戏场景构建等领域,显著提升创意工作效率。

Mr数据杨 928

【C++指南】C++中的内存对齐规则及原因详解

在计算机科学中,内存对齐是一种数据存储方式,它要求某些类型的数据必须存储在特定地址上。这种要求是由硬件架构决定的,不同的处理器可能有不同的对齐要求。C++作为一种底层抽象程度较高的编程语言,允许开发者通过编译器选项或特定语法来控制数据的内存布局,以满足这些硬件需求。 本文将详细介绍C++中的内存对齐规则及其背后的原理。

倔强的石头的博客 3525

置顶必读(1) | 滚雪球学Oracle教程导航帖,带你弯道超车(持续更新中)

什么是数据库管理系统(DBMS),Oracle在行业中的领先地位Oracle数据库的市场竞争与主要应用场景Oracle数据库的核心功能模块与未来技术发展趋势约束的高级应用:主键、唯一性、外键设计与管理表分区、视图、同义词与序列的最佳实践PL/SQL编程的设计哲学,如何高效使用Oracle SQL DeveloperPL/SQL代码调试与优化技巧RAC集群中的高可用性设计,负载均衡与并行查询的配置集群中的缓存一致性管理。

**My Coding Family** 1万+

C/C++中的内存对齐原则

结构体最后(重要):视结构体中最大类型是哪一个,如果是像 int 类型那样是 4 个字节的,并且结构体的结尾地址不满足 4 的倍数的话,向离最近的 4 的倍数地址补齐;如果是像 double 类型那样是 8 个字节的,并且结构体的结尾地址不满足 8 的倍数的话,向离最近的 8 的倍数地址补齐;结构体嵌套:子结构体的成员变量起始地址要视子结构体中最大变量类型决定,比如 struct a 含有 struct b,b 里有 char,int,double 等元素,那 b 应该从 8 的整数倍开始存储。

Menior_的博客 1352

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

对C++中的内存对齐理解

文章目录什么是内存对齐:为什么需要内存对齐:内存对齐的规则 什么是内存对齐: 内存对齐:计算机对于基本数据类型在内存中的存放位置有限制,数据的首地址是K(通常为4或8)的倍数 //32位系统 #include <iostream> //32位系统 struct { int x; char y; }; int main() { std::cout <<"S:" <<sizeof(S) << "\n";//// 输出8 retur

qq_29667889的博客 433

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++中的内存对齐介绍

网上有很多介绍字节对齐或数据对齐或内存对齐的文章,虽然名字不一样,但是介绍的内容大致都是相同的。这里以内存对齐相称。注:以下内容主要来自网络。 内存对齐,通常也称为数据对齐,是计算机对数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常使2、4、8、16、32或64)的倍数。 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而

agkl_hanhan的博客 947

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

内存布局与对齐:C++中的内存布局与对齐规则

1.背景介绍 在C++中,内存布局和对齐规则对于编写高效的程序来说至关重要。这篇文章将深入探讨C++中的内存布局和对齐规则,揭示它们如何影响程序性能和可移植性。 1. 背景介绍 C++是一种强类型、面向对象、多范式编程语言。它在许多领域得到了广泛应用,包括操作系统、网络编程、游戏开发等。C++的设计倾向于与硬件和操作系统接近,因此了解内存布局和对齐规则对于编写高效的C++程序至关重要。 内...

AI天才研究院 912

C/C++中的内存对齐详解

C/C++内存对齐:深度解析与应用

m0_71974552的博客 2540

Linux下C++中的内存对齐

这篇文章主要参考的是网上的一些资料,网上说的是VC环境下的,我在Linux下试了一下,把结果弄上来供大家一起学习之用。 首先考虑下面的一个结构: class TestClass { private: double da1; char da2; int da3; }; 我电脑是ubantu 64位的,我先测试一下double,char,int所占用的字节数.下面是截图。

LoveJelly 3120
上一篇: Linux下Java环境配置
下一篇: Linux必备命令技巧学习
EricGogh
博客等级 码龄19年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值