我有一个以CString
作为参数之一的函数,我在代码库中浏览,很多地方都以const CString&
作为参数。
所以我想知道使用CString
与const CString&
之间是否存在性能或行为差异?
答案 0 :(得分:1)
通过C ++非平凡类的值传递涉及调用复制构造函数,因此从性能角度来说,决定取决于它的作用。
如果我们谈论的是MFC / ATL CString
,则其复制构造函数不会执行像std::string
那样的深层复制(复制的确可能会非常昂贵,因为通常情况下,它需要新的分配和完整内容的副本),因为它实现了“写时复制”优化-给定CString
的副本实际上共享后备缓冲区,直到其中一个尝试修改它,从而触发实际副本。因此,副本相对便宜,但它们仍涉及原子整数摆弄,在现代处理器上可能并非完全免费。
因此:很可能const
引用的传递速度会稍快(尽管由于额外的间接步骤,对函数内部实际数据的访问将略有困难),但这不是我所需要的除非剖析确实显示它是瓶颈,否则我真的会担心。
答案 1 :(得分:-1)
通常不会。一个好的编译器和优化器应该产生相同的程序集。
这是因为引用在所有主要编译器中均作为指针实现,并且通过值或指针传递琐碎的数据类型(例如char*
)没有区别,因为在汇编级将参数传递给函数都是一样的sizeof(char*) == sizeof(char**)
。