我是C ++的新手并且有一些问题,这是其中之一。
当你使用一个接受一个或多个参数的函数时,是否有任何理由,你知道的参数在函数调用之前总是存储在变量中,以传递变量的副本,而不是指针到变量?
我在谈论表现。在我看来,传递整个结构的副本而不仅仅是一个指针(4个字节)需要更多的资源。
答案 0 :(得分:12)
传递副本有几种方法可以比传递指针更便宜。
还有其他原因需要传递副本而不是引用,即您的函数将在结构中进行更改,而不会反映给调用者。虽然这通常是一种不好的做法,但使参数按值传递将确保调用者的视图不会被错误地更改。
现在对于答案的一部分你可能不想听到:它通常没有那么大的差别!使用对程序语义最有意义的参数传递方法。如果您稍后发现特定区域存在性能瓶颈,那么请专注于提高性能。不要过度优化!
答案 1 :(得分:10)
通过指针(或引用)传递对象并传递同一对象的副本具有不同的语义。如果您希望对对象进行的更改反映在函数调用之外,则需要引用语义,否则您需要值语义。
通常,值语义可以通过按值传递值或通过const引用
来表示void value_semantics(my_obj obj);
void value_semantics(const my_obj& obj);
然而,const引用方式也有一些缺点,它会阻止编译器可能因为aliasing issues而对具有普通构造函数的对象进行多次优化(额外的间接级别)(引用实现为指针)可能超过避免复制的好处。
为了获得引用语义,您可以选择通过引用传递或通过指针传递,因为其他人已经说过引用比C ++中的指针更自然(您不必使用运算符&
的地址)并且指针的唯一真正优势是如果要启用NULL值。
经验法则是,对于非平凡的类,您应该通过const引用传递,否则通过值传递。
答案 2 :(得分:4)
指针打开了bug,因为它允许被调用者改变对象。指针可能为0,这往往会导致崩溃,这就需要在整个地方测试0指针,这可能很烦人。使用C ++引用,const
- 在可能的情况下声明,避免了这两个问题。
答案 3 :(得分:4)
避免使用pointer.Use常量引用,如果是IN参数,则只是IN OUT参数的引用
答案 4 :(得分:2)
主要问题不是性能,而是语义,以及你的函数是否修改了结构中的数据。
如果您的函数修改了结构,那么传递指针将让调用者看到结构中已更改的数据。在这种情况下,传递副本可能是错误的,因为您的函数将修改一个然后(可能)丢弃的副本。当然,您的函数可能会修改数据,但您不希望进行修改,在这种情况下,复制是正确的做法,以保护原始值不受更改的影响。
如果你的函数没有修改结构,那么没有理由复制这些值,因为它们只会被读取。
如果你不熟悉将指针传递给结构的概念,你应该做一些练习,因为这是处理C和C ++中结构的典型方法。
就性能而言,复制结构需要做更多的工作,但在方案中却相当小。首先要注意代码的语义。
答案 5 :(得分:1)
引用更常见,如果它们不会改变,则引用const引用。