我有一个函数,它将CString
作为参数之一,我正在查看代码库,许多地方都将const CString&
作为参数。
所以我想知道使用CString
和const CString&
之间是否存在性能或行为差异?
传递C++非平凡类的值涉及调用复制构造函数,因此从性能角度来看,决策取决于它的作用。
如果我们谈论的是MFC/ATLCString
,它的复制构造函数不会像std::string
那样执行深度复制(复制成本可能确实很高,因为在一般情况下,它需要新的分配和完整内容的副本),因为它实现了"写时复制"优化-给定CString
的副本实际上共享备份缓冲区,直到其中一个副本试图修改它,从而触发实际拷贝。出于这个原因,副本相对便宜,但它们仍然涉及一些原子整数篡改,这在现代处理器上可能不是完全免费的。
所以:很可能const
引用的传递速度会稍快一些(尽管由于额外的间接步骤,对函数内部实际数据的访问会受到一些影响),但这并不是我真正担心的事情,除非分析确实显示它是一个瓶颈。
通常不会。一个好的编译器&优化器应该生成相同的程序集。
这是因为引用在所有主要编译器中都是作为指针实现的,通过值或指针传递诸如char*
之类的琐碎数据类型没有什么区别,因为在汇编级,传递给函数的参数是相同的,即sizeof(char*) == sizeof(char**)
。