这取决于您所说的“成本”以及主机系统(硬件、操作系统)相对于操作的属性。
如果您的成本衡量标准是内存使用量,那么成本的计算是显而易见的 - 将正在复制的任何内容的大小相加。
如果您的衡量标准是执行速度(或“效率”),那么游戏就不同了。借助专用电路(机器寄存器及其使用方式),硬件(以及操作系统和编译器)往往会针对复制特定大小的事物的操作性能进行优化。
例如,对于一台机器来说,通常有一个架构(机器寄存器、内存架构等)会导致“最佳位置”——复制某种大小的变量是最“有效的”,但复制更大或更小的变量是少这样。较大的变量将花费更多的复制成本,因为可能需要对较小的块进行多次复制。较小的也可能成本更高,因为编译器需要将较小的值复制到较大的变量(或寄存器)中,对其进行操作,然后将值复制回来。
浮点示例包括一些 cray 超级计算机,它们本机支持双精度浮点(double
在 C++ 中也称为),并且所有单精度操作(float
在 C++ 中也称为)都在软件中模拟。一些较旧的 32 位 x86 CPU 在内部也使用 32 位整数,并且由于与 32 位之间的转换,对 16 位整数的操作需要更多的时钟周期(这不适用于更现代的 32 位或 64-位 x86 处理器,因为它们允许将 16 位整数复制到 32 位寄存器或从 32 位寄存器复制,并对其进行操作,这样的惩罚较少)。
按值复制一个非常大的结构将比创建和复制其地址效率低,这有点不费吹灰之力。但是,由于上述因素,“最好按值复制该大小的东西”和“最好传递其地址”之间的交叉点不太清楚。
指针和引用倾向于以类似的方式实现(例如,按引用传递可以以与传递指针相同的方式实现),但这不能保证。
唯一确定的方法是测量它。并意识到测量值会因系统而异。