热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

结构体指针作为参数的话,效率是高还是低?

如果一个函数,有10个参数,那么把这十个参数放到一个结构体里,用指针传进来,效率是变高了还是变低了呢?
如果一个函数,有10个参数,那么把这十个参数放到一个结构体里,用指针传进来,效率是变高了还是变低了呢?

14 个解决方案

#1


不会提高也不会降低。你不用结构,就要每个参数压栈,如果使用结构,就要每个参数朝结构里赋值,其实都差不多。唯一的不同是:如果数据太大,压栈会造成栈溢出,因此大数据要用指针

#2


大型数据类型使用指针,效率较高!(例如:类等。。。)

小型数据类型使用普通变量就可以了。。。。。。。。

#3


应该会变高吧
只传一个指针比十个参数要快点

#4


不会,在你调用函数前,把各个参数赋值进结构本身也是要花时间的,传参数省时间,但是准备参数多花时间
引用 3 楼 yang_e_2009 的回复:
应该会变高吧
只传一个指针比十个参数要快点

#5


   在实现层面上,只要你数据不大,其实本质上并没有多大变化。你放一个结构体里,每个指针还是一样要赋值。

   但从设计层面上,显然把这么多的参数放在一个结构体里更好。一个函数的参数个数是不能太多的,太多的话函数接口的可读性、易用性会大大降低,Windows API就是一个典型的例子(单看参数就让你眼花瞭乱)。因为用户看到的只是函数接口,因此接口必须设计的得简单易懂,易于使用。

   而且,设计接口时必须能很好应对变化。如果函数的参数很多,那最好的办法就是把其中一些有共性的参数抽离出来,封装成一个独立的结构(或类),这样当函数的参数增加或减少时,只需修改结构里里面的参数个数,而面向用户的函数接口上的参数列表没有任何变化。用户无需作任何修改。

   总之,我们需要把变化隐藏在后面,而对用户提供统一的相对不变的接口。

#6


如果仅仅从效率层面上讲的话,肯定是会提升的。但是,考虑到实用性,有如下几点可以参考一下:
1. 定义出的结构体是否通用,如果每个具有很多参数的函数都需要定义一个特定的结构体;那么,定义
   结构体是不可取的;
2. 接口的固定性,用结构体指针来代替多参数传递所带来的性能提升是微乎其微的,没有必要为了这点
   所谓的性能而修改接口定义,在大型软件开发过程中这点尤为重要。

#7


看原来的参数是如何传递,先前是传值的话而且参数是比较复杂的对象的话,用指针快,因为省去了在栈上创建副本对象的时间。
如果原来的参数是传地址或引用的话,应该效率相差不大。

#8


实际上,原来的十个参数都几乎是整形的
如果用结构体指针,不考虑赋值开销的话,实际上的开销就剩下用每个参数时的简接寻址了
而用十个参数,则要压十次栈,代价要大些,但如果使用寄存器传参数呢?是不是要快一些了?

#9


引用楼主 sigh02 的回复:
如果一个函数,有10个参数,那么把这十个参数放到一个结构体里,用指针传进来,效率是变高了还是变低了呢?


当然用指针那个快啦,快不少。只传一个指针和传十个参数,这还用说谁快谁慢么?

#10


十个参数的话,传指针要快啊,不然还得10个分别赋值

#11


引用楼主 sigh02 的回复:
如果一个函数,有10个参数,那么把这十个参数放到一个结构体里,用指针传进来,效率是变高了还是变低了呢?


传10个指针,要拷贝10个指针的副本到型参,传结构体的指针,只传了一个结构体的指针副本。

至于效率,不敢说。
但是如果你的参数多达数10个,那你就应该反思一下代码了,是不是过于臃肿了。

#12


可以详细说明一下吗?函数调用时,压栈传参的过程可以说下吗?
引用 1 楼 arong1234 的回复:
不会提高也不会降低。你不用结构,就要每个参数压栈,如果使用结构,就要每个参数朝结构里赋值,其实都差不多。唯一的不同是:如果数据太大,压栈会造成栈溢出,因此大数据要用指针

#13


引用 12 楼 bafghgle 的回复:
可以详细说明一下吗?函数调用时,压栈传参的过程可以说下吗?引用 1 楼 arong1234 的回复:
不会提高也不会降低。你不用结构,就要每个参数压栈,如果使用结构,就要每个参数朝结构里赋值,其实都差不多。唯一的不同是:如果数据太大,压栈会造成栈溢出,因此大数据要用指针

不同的函数调用形式会导致不同参数压栈顺序。

#14


感谢大家!
hoho

推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
author-avatar
Hykun
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有