c struct 内存分配

​热电偶测温电路图(一)​ 高精度热电偶测温电路图 此设计概括了提供传感器诊断所必需的抗混叠滤波器和偏置电阻器。此示例还提供了一种新颖的方式,即使用ADS1118上的板载温度传感器完成对系统的冷端补偿。对于热电偶线性化,此设计还提供了一种非常简单的、可以在大多数微控制器上实施的线性算法。 缺点就是太贵。 特性 测量K型热电偶温度 精度1°C 高精度/可重复性0.2°C 包含冷端补偿 包含软件算法 使用ADS111816位ADC(带PGA) 原理图/方框图 热电偶测温电路图(二) OP07构成的高稳定热电 阅读详情

请看下面的结构:

struct MyStruct

{

    double dda1;

    char dda;

    int type;

};

对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?

也许你会这样求:sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)=16。你知道为什么在VC中会得出这样一个结果吗?

其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vs6.0&vs8.0,32位系统)。

类型

对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)

char

偏移量必须为sizeof(char),即1的倍数

short

偏移量必须为sizeof(short),即2的倍数

int

偏移量必须为sizeof(int),即4的倍数

float

偏移量必须为sizeof(float),即4的倍数

double

偏移量必须为sizeof(double),即8的倍数

各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

下面用前面的例子来说明VC到底怎么样来存放结构的。

struct MyStruct

{

    double dda1;

    char dda;

    int type;

};

为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,依次分配。

(1)先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同,刚好偏移量0刚好为sizeof(double)的倍数,该成员变量占用sizeof(double)=8个字节;

(2)接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;

(3)接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;

(4)这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。

(5)所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。

下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:

struct MyStruct

{

    char dda;

    double dda1;

    int type;

};

这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruct)=24。结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。(简单说明)

struct MyStruct

{

     /*偏移量为0,满足对齐方式,dda占用1个字节*/

    char dda;

    /*下一个可用的地址的偏移量为1,不是sizeof(double)=8的倍数,

    需要补足个字节才能使偏移量变为(满足对齐方式),因此VC自动填充7个字节,

    dda1存放在偏移量为8的地址上,它占用8个字节。*/

    double dda1;

    /*下一个可用的地址的偏移量为16,是sizeof(int)=4的倍数,满足int的对齐方式,

    所以不需要VC自动填充,type存放在偏移量为的地址上,它占用4个字节。*/

    int type; 

};

所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数。

所以该结构总的大小为:sizeof(MyStruct)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。

VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。

VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。下面举例说明其用法。

#pragma pack(push) // 保存对齐状态

#pragma pack(4) // 设定为4字节对齐

struct test

{

    char m1;

    double m4;

    int m3;

};

#pragma pack(pop) // 恢复对齐状态

以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。(请读者自己分析)

 

    在VC6中,Project SettingsàC/C++àStruct member alignment中默认值为8Bytes *。Struct member alignment用以指定数据结构中的成员变量在内存中是按几字节对齐的,根据计算机数据总线的位数,不同的对齐方式存取数据的速度不一样。这个参数对数据包网络传输等应用尤为重要,不是存取速度问题,而是数据位的精确定义问题,一般在程序中使用#pragma pack来指定。

 

参考:

《The sizeof Operator》

《VC中的sizeof的用法总结》

《什么是内存对齐》

海康威视 2024届 数字逻辑设计 实习笔试分析 记录一下 5月11日晚,做的海康威视的一场笔试。分享给需要的IC人。 岗位:数字逻辑设计工程师(浙江 杭州) 转载需要本人同意! 我的见解不一定都是准确的,欢迎评论区交流指正~~ 阅读详情

相关推荐

windows系统下,如何为comfyui如何安装triton

​ 有些加速插件、模型在安装的时候,比如说sageattention的安装,就需要提前安装triton这个包,不过这个包有点特殊,windows下略微不好装,经常会装失败。 🎠如何安装 之前也有人介绍过,要到github上找个wheel文件,找到对应的版本安装下就好了。 问题是:https://github.com/woct0rdho/triton-windows/releases 这个git地址上,已经找不到wheel文件了... ​

聚梦小课堂 4497

【C语言】struct结构体内存如何分配

1.结构体内存分配是根据结构体成员的类型大小分配的,且结构体分配内存是实例化之后分配的。 对于以上的结构体,struct demo的大小是多少呢?有些同学会觉得是13个字节,其实并不是,这里的 struct demo 的大小是24个字节。 我们可以用 sizeof()来测试下结果: 输出结果为: 那么从以上测试代码可以总结出: 1.结构体大小计算时,是以结构体成员的类型大小最大的那个为单位分配的。 2.结构体分配内存是结构体实例化之后才分配的,在栈内或堆内分配。

赖东东_的博客 3676

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 603

VC字节对齐全攻略

  VC中下面几个结构体大小分别是多少呢struct MyStruct{    double m4;    char m1;    int  m3;};struct MyStruct {    char m1;    double m4;    int m3;};#pragma pack(push)//保存对齐状态#pragma pack(16)  //设置为16字节对齐struct test

sunewer的专栏 1955

Minecraft Forge模组开发入门:从环境搭建到事件监听实战

事件驱动编程是一种基于事件和事件监听器的软件架构模式,其核心原理是通过事件总线实现组件间的松耦合通信。在游戏开发领域,这种模式能够有效处理玩家交互、状态变更等异步操作,具有高度的灵活性和可扩展性。Java作为面向对象编程语言,通过注解和反射机制为事件驱动提供了天然支持。Minecraft模组开发正是事件驱动编程的典型应用场景,开发者可以利用Forge框架提供的事件总线监听游戏内各种行为。本文以Minecraft Forge模组开发为例,详细讲解如何通过Gradle构建工具搭建开发环境,并实现自定义方块注册和

culi3182的博客 395

ISP Tuning实战指南:从基础到高级的色彩与亮度优化

本文详细介绍了ISP Tuning的基础概念与高级调优技术,包括黑电平校正(BLC)、自动白平衡(AWB)、色彩校正矩阵(CCM)和Gamma曲线调整等核心算法。通过实战案例和调试技巧,帮助工程师提升摄像头成像质量,解决高光过曝、暗部噪点等常见问题,适用于智能门铃、车载摄像头等多种场景。

weixin_30879169的博客 108

sizeof(struct) 转

  sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。  它在编译时起作用,而不是运行时。  这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体:  struct S1  {  char c;  int i;  };  问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加...

weixin_30838921的博客 190

在trae CN中使用conda环境(已解决)

Trae CN 是字节跳动于 2025 年 3 月 3 日发布的国内首个 AI 原生集成开发环境(AI IDE)123。

zwzscnds的博客 6936

C++ sizeof(struct)计算结构体大小

一、sizeof() 在学习C++的时候会学到一个sizeof操作符,在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。单位是位(byte)。 我们都知道char、short、int、long、float、double的大小; 二、结构体的大小 定义一个结构体: struct stru{ char a; int b; float c; double d; }; ...

GL3_24的博客 2万+

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6026

【人工智能】在 cc-switch 中配置 AnyRouter 接入 Claude Code 完整指南

本文介绍了在cc-switch工具中配置AnyRouter中转服务以接入Claude Code的详细步骤。主要内容包括:1) 准备API令牌和端点地址;2) 填写基础信息和模型参数;3) 保存配置并重启终端生效;4) 常见问题排查方法。重点强调了API地址格式、模型ID准确性以及配置写入的必要性,帮助用户顺利完成中转服务配置,实现Claude 4.5版本的正常使用。

奶爸的编程之路,也就一周冷个三天 3103

关于sizeof(struct)

一般情况下,编译器会把struct中的成员作对齐处理,所以sizeof后不是等于所以成员大小之和。 VC编译器一般会按照顺序为struct中的成员分配内存: (1)分配一个大小等于基大小的内存; (2)从第一个到最后一个成员,取得每个成员的大小为N,调整可插入内存起始地址,使得(可插入内存起始地址 -struct起始地址)为N的倍数(向后移调整),从可插入内存起始地址 开始插入成员, 如果分配的剩...

JxufeCarol的博客 2158

2025年软件测试职业院校技能大赛—ERP管理平台-采购管理采购入库模块测试用例

竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 401

C语言-struct 结构体变量的内存分配

struct内存分配 定义技巧 首先我们定义struct变量,笔者习惯定义时,直接输入: struct name { }; 再对struct内部成员进行定义,防止“;”遗漏,导致程序报错。 先看一段代码 #include<stdio.h> struct A { char a; short b; int c; }; struct B { int c; short a; cha...

weixin_41453492的博客 9223

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C --struct union内存分配

嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。也就是说Big-endian模式符合人的习惯,而Little-endian更加方便计算机操作。 例如,16bit宽的数0x1234在Little-endian模式CPU内

manchestermi的博客 1093

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++ 中struct嵌套的内存分配

一、概述         一直只知道非嵌套结构体的内存分配大小,却没想过如果结构体有嵌套怎么办?星期二参加360的笔试碰到了这样的题目,自然也就答不上来。今天编码试了下,得出了结论,在此记录下。这里主要探讨两点,非嵌套结构体的内存分配问题和结构体嵌套的内存分配问题。第一点是第二点的基础,所以我们先探讨非嵌套结构体的内存分配。 二、非嵌套结构体        非嵌套结构体内存分配大致遵循两个原

GAMELOFT9----纸上得来终觉浅,绝知此事要躬行 4442

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言之struct结构体内存分配

实验使用sizeof关键字测量结构体大小的规则 查资料得到的规则如下 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素...

zd845101500的博客 1527

C/C++中结构Struct和Class的区别,内存分配中的各种区别

C/C++的Struct中也有构造函数和析构函数等,其余Class的区别如下: 如果从空间分配上来看,struct变量放在栈上,而class变量放在堆上,因此struct变量会自动释放,而class变量需要手动释放。 c不是面向对象的语言,没有继承等概念。 struct默认成员类型是public,class默认成员类型是private。 补充一下内存分配的知识点,如下: 1.内存分配 分为...

misterdo的专栏 2218

嵌入式C语言之struct内存分配分析

以下内容均来源于网络资源的学习和整理,如有侵权,请告知删除! 本文摘自微信号《嵌入式ARM》。 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?   也许你会这样求:sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13  但是当在VC中测试上面结构的大小时,你会

主要记录嵌入式学习与开发过程。 1922

C/C++ struct初始化/复制/内存分配技巧

网上看到一篇关于struct的赋值技巧,里面竟然还有些东西不太清楚。汗。。。比如struct乱序赋值。 网址如下:http://blog.chinaunix.net/space.php?uid=8735300&do=blog&cuid=417268 为了方便后面的介绍,先定义一个struct类型:         struct User         {            

wys的专栏 1248

struct的用法和struct的对齐原则

struct用法: struct在C语言中作为结构体。 结构体定义: struct stu{ char job[20]; int age; float height; }; 使用: struct stu a; //或者省略关键字struct stu a; 也可以定义和使用同时: struct stu{ char job[20]; int age; float height; } a; 在后续使用中,出现结构体类型的

马小超 1516
上一篇: C++类型转换总结
下一篇: 从1.5k到18k, 一个程序员的5年成长之路
p11323
博客等级 码龄14年 79粉丝 197原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值