不要什么变量都想往“结构体“里塞

【转载】

大家好,我是bug菌!

前段时间走了一批伙计,最近又来了几张新面孔,职场就这样来来去去,在人潮中会结实很多新的伙伴,也会有很多人因此成为过客,当你渐渐适应这一切,或许就变成熟了吧。

来一段时间的软件工程师也该有点成果了,代码总要review才能上传与发布,于是组内抽了几个小时走读了一下,其实看一份代码不仅仅只是功能上的实现和设计上的优劣,很多大佬们更在意编码者的水平、风格、态度等等。

而这一次的review给我最大的感受是:"怎么啥东西都往结构体里面塞?",毫不相关的变量还硬是要放在一个结构体里面才觉得舒坦,好吧,或许也就是大部分所认为的面向结构体设计吧~

 1typedef struct _tag_Obj{2    int var;34    struct _tag_member1{5        int var;67        struct _tag_member2{8            int var;9
10            struct _tag_member3{
11                int var;
12
13                struct _tag_member4{
14                    int var;
15
16                }member4;
17
18            }member3;
19
20        }member2;
21
22    }member1;
23}stObj;

比如上面的结构体定义,你可能认为bug菌夸张了,我只想说那位哥们的结构体定义比这个还恐怖~

1

带来的问题

结构体嵌套虽然在一定程度上相比普通变量访问会耗费一些时间,不过对于大部分项目中还是能够容忍的,然而这份容忍也是一个量变到质变的过程。

参考代码:

 1#include <stdio.h>2#include <stdlib.h>34typedef struct _tag_Obj{5    int var;67    struct _tag_member1{8        int var;9
10        struct _tag_member2{
11            int var;
12
13            struct _tag_member3{
14                int var;
15
16                struct _tag_member4{
17                    int var;
18
19                }member4;
20
21            }member3;
22
23        }member2;
24
25    }member1;
26}stObj;
27
28#define MAX_NUM 5
29stObj obj[MAX_NUM];
30
31int main(int argc, char *argv[]) {
32    int index = 0;
33
34    for( index = 0;index < MAX_NUM;index++ )
35    obj[index].member1.var = obj[index].member1.member2.member3.member4.var + obj[index].member1.member2.member3.var;
36
37    return 0;
38}

以上的程序应该够简单,循环把每个member3和member4的var求和并复制给member1的var,不过结构体嵌套多层导致成员的访问非常麻烦,不便于书写,嵌套得越深,其表达式越长,当然你可以使用宏定义勉强让自己好受一点,我们还是来看看汇编吧:

 

上面红色标注处为局部变量index的访问,绿色部分为for循环的判断,也就是说每个循环执行这样的加法操作都需要使用index到结构体中寻找相应的成员来进行处理,且重复运行指令非常之多。

上面例子中的循环并不是太多,一旦访问增加、结构体内部数组等索引变复杂就会非常耗时。

2

如何改善呢?

如果结构体成员仅仅只是用来作为相关参数访问,一定要放在循环等复杂等耗时任务之外,比如下面代码:


1......
2//1、直接处理 
3for( i = 0;i < 10;i++ )
4{
5    //if(adcSample[i] > obj[index].member1.member2.member3.member4.var).... 
6    //...... 
7}
8
9//2、可以考虑的一种优化办法 
10param = obj[index].member1.member2.member3.member4.var;
11for( i = 0;i < 10;i++ )
12{
13    //if(adcSample[i] > param).... 
14    //...... 
15}
16......

直接处理方式会导致重复的结构体成员访问,那就会有前面那样重复执行一大堆汇编指令,而直接取出来以后通过其他变量间接访问,那么耗时就大大减少;当然如果你的编译器比较给力,可能会帮你处理,不过一般情况下并不会。

同样如果是嵌套得比较深且需要经常访问的结构体成员,尽量使用指针等提前标记然后再频繁访问,这样效率更高。

其实总结起来那还是那句老生常谈的话"时间和空间的互换",体会一下奥~

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

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

相关文章

开发一款小程序游戏需要多少钱?

小程序游戏的开发成本因多种因素而异&#xff0c;无法提供具体的固定数字。以下是影响小程序游戏开发成本的一些关键因素&#xff1a; 游戏规模和复杂度&#xff1a; 小程序游戏可以是简单的休闲游戏&#xff0c;也可以是更复杂的策略游戏。规模和复杂度会影响开发所需的时间和…

两数之和-leetcode

leetcode 简单题型&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重…

使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出

本文介绍了使用.NET 4.0、3.5时&#xff0c;UnmanagedFunctionPointer导致堆栈溢出的处理方法&#xff0c;对大家解决问题具有一定的参考价值&#xff0c;需要的朋友们下面随着小编来一起学习吧&#xff01; 问题描述 我在带有try catch块的点击处理程序中有一个简单的函数。…

字节跳动小程序开发:探索创新的数字化世界

在数字化时代&#xff0c;字节跳动小程序开发成为企业数字化转型的关键一环。通过这一平台&#xff0c;企业能够借助先进的技术和丰富的功能&#xff0c;实现创新、引领市场潮流。本文将通过一些简单的技术代码示例&#xff0c;带你深入了解字节跳动小程序开发的魅力。 1. 小…

科研学习|研究方法——python T检验

一、单样本T检验 目的&#xff1a;检验单样本的均值是否和已知总体的均值相等前提条件&#xff1a; &#xff08;1&#xff09;总体方差未知&#xff0c;否则就可以利用 Z ZZ 检验&#xff08;也叫 U UU 检验&#xff0c;就是正态检验&#xff09;&#xff1b; &#xff08;2&a…

Android SmartTable根据int状态格式化文字及颜色

private void initData() {List<UserInfo> list new ArrayList<>();list.add(new UserInfo("一年级", "李同学", 6, 1, 120, 1100, 450, 0));list.add(new UserInfo("一年级", "张同学", 6, 2, 120, 1100, 450, 1));list…

工业数据采集分析 数据跨层次、跨环节、跨系统大整合

在“工业4.0”、“智能制造”、“工业互联网”的大背景下&#xff0c;数据采集早就成为一个广泛关注的热点话题&#xff0c;不论智能制造发展到何种程度&#xff0c;数据采集都是生产过程中应用非常频繁的需求&#xff0c;也是工业物联网不可或缺的一环。 利用工业数据采集系统…

处理机器学习数据集中字符串列(pandas.get_dummies)

如图&#xff0c;在数据集中week列的数据不是数值型&#xff0c;会导致我们在训练过程中难以处理。 而pandas库中有一个非常好用的函数&#xff0c;独热编码pandas.get_dummies(df) 使用此函数之后&#xff0c;会在原数据中新建各列代表Fri-Sun&#xff0c;值为0或1&#xff…

阶乘算法优化

__attribute__((noinline)) int test(int n) {int fact 1, num n 1;int i 1;for (i 1; i < num; i) {fact * i;}return fact; } int main() {printf("%d\n", test(1000000000)); } 为方便分析&#xff0c;函数calc()前面加上__attribute__((noinline))&#…

【大话Presto 】- 核心概念

文章目录 前言Operator Model And Iterator Model系统组成Connector数据模型查询执行模型StatementStageTaskSplitDriverOperatorExchangePipeLine 总结 前言 Presto&#xff08;PrestoDB&#xff09;是一个FaceBook开源的分布式MPP SQL引擎&#xff0c;旨在处理大规模数据的查…

全新的FL studio21.2版支持原生中文FL studio2024官方破解版

FL studio2024官方破解版是一款非常专业的音频编辑制作软件。目前它的版本来到了全新的FL studio21.2版&#xff0c;支持原生中文&#xff0c;全面升级的EQ、母带压线器等功能&#xff0c;让你操作起来更加方便&#xff0c;该版本经过破解处理&#xff0c;用户可永久免费使用&a…

spark 窗口滑动用于在不同的数据块之间执行操作

在 Scala 中进行分布式执行&#xff0c;例如使用 Apache Spark&#xff0c;可以通过设置窗口滑动来实现不同 RDD 之间的关联处理。窗口滑动是一种窗口操作&#xff0c;用于在不同的数据块之间执行操作。 以下是一个简单的示例&#xff0c;演示如何在 Spark 中使用窗口滑动&…

「校园 Pie」 系列活动正式启航,首站走进南方科技大学!

PieCloudDB 社区校园行系列活动「校园 Pie」已正式启动。「校园 Pie」旨在促进数据库领域的学术交流&#xff0c;提供一个平台让学生们了解最新的数据库发展趋势和相关技术应用。 在「校园 Pie」系列活动中&#xff0c;PieCloudDB 社区将携拓数派技术专家&#xff0c;社区大咖…

可以免费使用的设计素材网站分享

UI设计师最怕什么&#xff1f; 没有创意&#xff0c;没有灵感&#xff0c;没有思路&#xff01; 在哪里可以得到idea&#xff1f;别担心&#xff0c;往下看&#xff01; 你知道网络有多大&#xff0c;你想要什么吗&#xff1f;今天&#xff0c;我想和大家分享一些宝藏网页设…

用户运营:如何搭建用户分析体系

在运营的工作范畴中&#xff0c;用户运营是很重要的一个环节&#xff0c;甚至有公司会设置专门的“用户运营”岗位。 用户运营的价值体现在多个方面&#xff0c;不仅可以帮助引流、吸引更多用户使用产品&#xff0c;在用户正式使用产品之后的运营则更为重要。通过日常用户运营&…

Angular 组件介绍及使用(一)

Angular 概述 Angular 是一个用于构建 Web 应用程序的开源前端框架&#xff0c;由 Google 团队开发和维护。它采用 TypeScript 编程语言&#xff0c;并借鉴了一些传统的 Web 开发模式和最佳实践&#xff0c;提供了强大而灵活的工具和特性。 以下是 Angular 的一些概述要点&am…

让Git自动忽略指定文件

要让Git忽略指定文件&#xff0c;你可以使用.gitignore文件来实现。.gitignore文件允许你指定要从版本控制中排除的文件和文件夹。 以下是如何创建和设置.gitignore文件以忽略指定文件的步骤&#xff1a; 1.在你的项目根目录下创建一个名为.gitignore的文件。 2.使用文本编辑…

SpringMVC调用流程

SpringMVC的调用流程 SpringMVC涉及组件理解&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ] HandlerMapping : SpringMVC提供&…

转录组分析小故事丨什么是RNAseq?

揭开转录组分析的面纱 亲爱的读者: 欢迎来到生物信息奇妙之旅&#xff01;我是您的导航员&#xff0c;今天将带您走进玉米的微观世界&#xff0c;一探真核生物有参转录组分析的秘密。 想象一下&#xff0c;我们将穿梭于DNA与RNA的世界&#xff0c;用数据的眼睛揭示生命的奥秘&a…

第四代智能井盖传感器:万宾科技助力城市安全

在繁华喧嚣的城市里人来人往&#xff0c;井盖作为基础设施的一个组成部分在路面上分布范围广。然而这些看似普通的井盖却存在着位移、水浸的风险&#xff0c;可能给我们的生活带来诸多不便&#xff0c;更会威胁到我们的人身安全。如何有效监测和管理井盖的状态&#xff0c;成为…