gpt4 book ai didi

c++ - 按值传递与按引用或指针传递的性能成本?

转载 作者:IT老高 更新时间:2023-10-28 21:34:20 27 4
gpt4 key购买 nike

让我们考虑一个对象 foo(可能是一个 int、一个 double、一个自定义 structclass,随便什么)。我的理解是,通过引用函数来传递 foo(或者只是传递一个指向 foo 的指针)会导致更高的性能,因为我们避免制作本地拷贝(这可能很昂贵如果 foo 很大)。

但是,从答案 here似乎在实践中可以预期 64 位系统上的指针大小为 8 字节,无论指向什么。在我的系统上,一个 float 是 4 个字节。这是否意味着如果 foofloat 类型,那么仅按值传递 foo更有效而不是给它一个指针(假设没有其他约束会使在函数内使用一个比另一个更有效)?

最佳答案

这取决于您所说的“成本”,以及主机系统(硬件、操作系统)相对于操作的属性。

如果您的成本衡量标准是内存使用量,那么成本的计算是显而易见的 - 将要复制的任何内容的大小相加。

如果您的衡量标准是执行速度(或“效率”),那么游戏就不同了。借助专用电路(机器寄存器及其使用方式),硬件(以及操作系统和编译器)往往会针对复制特定大小的事物的操作性能进行优化。

例如,对于具有导致“最佳位置”的架构(机器寄存器、内存架构等)的机器来说,这是很常见的——复制某种大小的变量是最“有效的”,但复制更大的 OR较小的变量则更少。较大的变量将花费更多的复制成本,因为可能需要对较小的 block 进行多次复制。较小的也可能成本更高,因为编译器需要将较小的值复制到较大的变量(或寄存器)中,对其进行操作,然后将值复制回来。

浮点示例包括一些 cray super 计算机,它们 native 支持 double 浮点(在 C++ 中又称为 double),以及所有单精度运算(又称为 float 在C++)在软件中模拟。一些较旧的 32 位 x86 CPU 在内部也使用 32 位整数,并且由于与 32 位之间的转换,对 16 位整数的操作需要更多的时钟周期(这不适用于更现代的 32 位或 64-位 x86 处理器,因为它们允许将 16 位整数复制到 32 位寄存器或从 32 位寄存器复制,并对其进行操作,这样的惩罚更少)。

按值复制一个非常大的结构将比创建和复制其地址效率低,这有点不费吹灰之力。但是,由于上述因素,“最好按值复制该大小的东西”和“最好传递其地址”之间的交叉点不太清楚。

指针和引用倾向于以类似的方式实现(例如,通过引用传递可以以与传递指针相同的方式实现),但这并不能保证。

唯一确定的方法是测量它。并意识到测量值会因系统而异。

关于c++ - 按值传递与按引用或指针传递的性能成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40185665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com