【发布时间】:2014-05-22 04:54:45
【问题描述】:
我正在和朋友讨论以下函数原型:
void str_buf_append(const char&);
目的只是将一个字符添加到字符串缓冲区以及与当前问题无关的一些其他任务,即:鉴于我们没有修改输入字符,是通过引用传递还是通过价值?
我的朋友的论点是,如果你通过引用传递一个 char,你把一个 int 大小的东西放到堆栈上,而如果你通过值传递,你只是把一个字节大小的东西放在那里.
不过,在我看来,这还不是全部:当您通过值传递时,我认为您实际上是在执行以下操作:
- 在内存中与原始角色不同的某个位置创建角色的副本。
- 调用函数时,将复制字符的引用压入堆栈,因此不会保存任何内容,因为在后台,您仍在使用指针——只是指向不同内存位置的指针。
所以我的结论/意见是,在这种情况下,通过引用传递确实比通过值传递更有效。
谁是对的?
【问题讨论】:
-
C++ 标准没有定义(取决于编译器/目标平台)
-
在这两种情况下,都可能使用寄存器。即使它们不是 ,您也可能会发现堆栈指针无论如何都会以
sizeof(int)的间隔向上跳跃。 -
如果没有通过可靠的测试和对依赖于平台的优化 asm 的仔细检查来进行基准测试,你们两个人都没有。如果花时间这样做,您可能双方都会感到惊讶。
-
这取决于平台,但在大多数平台上,这两种变体可能同样有效。看编译器生成的汇编代码,自己看。
-
也很难想象这种级别的性能会很重要。我见过太多的代码,人们在进入 O(n^2) 算法的过程中从堆栈中删除了几个字节,该算法应该是 O(n) 或 O(log n)...
标签: c++ parameter-passing pass-by-reference pass-by-value