热门标签 | 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

推荐阅读
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 应对.avast后缀勒索病毒:全面指南
    本文详细介绍了.avast后缀勒索病毒的特性、感染途径、恢复方法及预防措施,旨在帮助用户有效应对这一威胁。 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 详细指南:使用IntelliJ IDEA构建多模块Maven项目
    本文在前两篇文章的基础上,进一步指导读者如何在IntelliJ IDEA中创建和配置多模块Maven项目。通过详细的步骤说明,帮助读者掌握项目模块化管理的方法。 ... [详细]
  • 本文针对Android 6.0平台的输入子系统进行了详细探讨,特别关注了智能电视开发中常见的KeyEvent事件处理机制。通过分析InputManagerService的启动过程、应用程序如何注册键盘消息监听、InputReader读取键盘消息的方式、InputDispatcher分发键盘消息的过程以及Java层的键盘消息分发机制,为开发者提供了一个全面的视角。 ... [详细]
  • 本文深入探讨了WebGL与Three.js在构建多样化3D场景中的应用,详细解析了两者如何协同工作以实现高性能的3D渲染,并提供了实践指南。 ... [详细]
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社区 版权所有