结构变量的占用多少个字节

news2024/12/15 21:47:00

1、在linux中,这种写法比较清晰

struct gpio_led_data {
    u8 can_sleep; //如果定义了结构变量,则该成员占用1个字节
    u8 blinking;    //如果定义了结构变量,则该成员占用1个字节
};

struct gpio_leds_priv {
    int num_leds; //如果定义了结构变量,则该成员占用4个字节
    struct gpio_led_data leds[];
    //相当于分配gpio_led_data leds结构指针,表示指向的是一个结构型数组,表达更加清晰;
    //如果定义了结构变量,则该成员占用4个字节

};

struct gpio_leds_priv gpio;//占用8个字节
struct gpio_led_data  led[4];//占用8个字节
int size;
int size1;
int size2;

int main(void)
{
    gpio.num_leds=4;//假定有4个灯
    size1=sizeof(struct gpio_leds_priv);//size1=8
    size2=sizeof(struct gpio_led_data *);//size2=8
    size=size1+size2;//size=16

    gpio.leds[0]=led[0];gpio.leds[0].can_sleep=1;
    gpio.leds[1]=led[1];gpio.leds[1].can_sleep=0;
    gpio.leds[2]=led[2];gpio.leds[2].can_sleep=1;
    gpio.leds[3]=led[3];gpio.leds[3].can_sleep=0;
}

仿真后的结果如下:

注意; 结构里用指针:gpio和led[4]占用16个字节

2、如果将上面的改成指针,程序可读性不太好

struct gpio_led_data {
    u8 can_sleep;//如果定义了结构变量,则该成员占用1个字节
    u8 blinking;//如果定义了结构变量,则该成员占用1个字节
};

struct gpio_leds_priv {
    int num_leds;               //如果定义了结构变量,则该成员占用4个字节
    struct gpio_led_data *leds;
    //如果定义了结构变量,则该成员占用4个字节
    //这里直接使用的是指针,但是我们只知道它指向一个结构,这个结构是什么,就不是很清晰了.

};

struct gpio_leds_priv gpio;  //占用8个字节
struct gpio_led_data  led[4];//占用8个字节
int size1;
int size2;
int main(void)
{
    gpio.num_leds=4;
    
    size1=sizeof(struct gpio_leds_priv);//占用8个字节
    size2=sizeof(struct gpio_led_data) * gpio.num_leds;//占用8个字节

    gpio.leds=&led[0];
    gpio.leds->can_sleep=1;
    gpio.leds=&led[1];
    gpio.leds->can_sleep=0;
    gpio.leds=&led[2];
    gpio.leds->can_sleep=1;
    gpio.leds=&led[3];
    gpio.leds->can_sleep=0;
}

注意:结构里用指针:gpio和led[4]占用16个字节

3、在stm32中,我们喜欢直接表达

struct gpio_led_data {
    u8 can_sleep;
//如果定义了结构变量,则该成员占用1个字节
    u8 blinking; //如果定义了结构变量,则该成员占用1个字节
};

struct gpio_leds_priv {
    
int num_leds;                //如果定义了结构变量,则该成员占用4个字节
    struct gpio_led_data leds[4]; //如果定义了结构变量,则该成员占用8个字节
};

struct gpio_leds_priv gpio;//占用12个字节
int size1;
int size2;
int main(void)
{
    gpio.num_leds=4;
//假定有4个灯
    size1=sizeof(struct gpio_leds_priv);//4个灯占用内存为12个字节
    size2=sizeof(gpio);//4个灯占用内存为12个字节
    gpio.leds[0].can_sleep=1;
    gpio.leds[1].can_sleep=0;
    gpio.leds[2].can_sleep=1;
    gpio.leds[3].can_sleep=0;
}

注意: 结构里不用指针: gpio占用12个字节

这三种写法,不用指针,比较节省内存。

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

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

相关文章

网页端web内容批注插件:

感觉平时每天基本上90%左右的时间都在浏览器端度过,按理说很多资料都应该在web端输入并且输出,但是却有很多时间浪费到了各种桌面app中,比如说什么notion、语雀以及各种笔记软件中,以及导入到ipad的gn中,这些其实都是浪…

递归问题(c++)

递归设计思路 数列递归 : 如果一个数列的项与项之间存在关联性,那么可以使用递归实现 ; 原理 : 如果一个函数可以求A(n),那么该函数就可以求A(n-1),就形成了递归调用 ; 注意: 一般起始项是不需要求解的,是已知条件 这就是一个典型…

分布式 窗口算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…

Linux shell的七大功能 --- history

1.直接输入“history” 这个命令可以显示出曾经使用过的命令(最近时间的500条) history 2.“history”命令也可以搭配其他命令一起使用。 例:history | grep "vim",找出所有包含“vim”的记录; 也可以搭配…

C# 探险之旅:第九节 - 循环(for):无限循环的魔法轮盘!

嘿,勇敢的探险家们,欢迎回到C#的神秘世界!在这一节里,我们将踏上一场关于循环的奇妙冒险,特别是那个能带我们无限次探险的“for循环”!准备好了吗?让我们一起揭开for循环的神秘面纱,…

基于回溯法解决八皇后问题+以位运算方法优化n皇后问题(算法与数据结构期末设计)

文章目录 基于回溯法解决八皇后问题以位运算方法优化n皇后问题1. 八皇后问题问题描述2.回溯法求八皇后(n皇后)问题①由四皇后问题引入②皇后的占位问题③皇后的放置过程④放置过程中的问题⑤回溯算法核心⑥回溯算法的求解过程⑦验证算法和代码实现LeetCo…

python学opencv|读取图像(九)用numpy创建黑白相间灰度图

【1】引言 前述学习过程中,掌握了用numpy创建矩阵数据,把所有像素点的BGR取值设置为0,然后创建纯黑灰度图的方法,具体链接为: python学opencv|读取图像(八)用numpy创建纯黑灰度图-CSDN博客 在…

若依实现图片上传时自动添加水印

文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用,并有效保护图片版权,若依项目需要实现一个功能:上传图片时,自动在图片上添加水印。这不仅可以有效防止盗用&#xff…

[C#与C++交互] 跨进程通信NamedPipes

目录 1、前言 2、什么是命名管道? 3、实现步骤 4、示例代码 4.1 C 服务器代码 4.2 C# 客户端代码 5、运行步骤 6、注意事项 7、应用场景 8、优缺点 9、总结 1、前言 在 C# 和 C 应用程序之间进行数据交换时,命名管道(Named Pipes…

ubuntu+ros新手笔记(三)

系统ubuntu22.04 ros2 humble 1. 设置ubuntu终端字体大小 点击Terminal右上角的三条横线—>Preferences—>Unnamed—>Text—>勾选Custom font—>点击右侧的字号(我的显示的是12)—>最下方Size处设置字号大小—>Select—>设置完…

使用echarts实现3d柱状图+折线图

以下代码有问题请直接问国内直连GPT/Claude HTML 需要注意threeDchart一定要设置宽度高度&#xff0c;不然图不显示,然后echarts版本不要太低&#xff0c;不然也不显示 <div id"threeDchart" class"threeDchart"></div>js set3DBarChart2(dat…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛&#xff0c;在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺&#xff0c;限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生&#xff0c;它是一种用来将 SDR 源信号转换为 HDR 源信号的技术&#xff0c;可以应用于…

迎接全新的 Kotlin 支持 – K2 模式:基本信息

K2 模式有什么作用&#xff1f; K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现&#xff0c;它可以提高 IDE 的稳定性&#xff0c;同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别&#xff1f; K2 编译器负责编译 Kotlin 语言 2.0 或…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面&#xff0c;一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期&#xff01;12 月 15 日&#xff08;周日&#xff09;上午&…

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…