我是C++的新手并且有一些问题,这是其中之一.
有没有什么理由当你使用一个函数来接受一个或几个参数时,你知道的参数将始终存储在函数调用之前的变量中,以传递变量的副本,而不是指向变量的指针?
我在谈论表现.在我看来,传递整个结构的副本而不仅仅是一个指针(4个字节)需要更多的资源.
有几种方法可以传递副本比传递指针更便宜.
对象等于或小于指针.直接访问值总是比取消引用指针更快.
结构足够小,可以由编译器放在堆栈上.在这种情况下,通过索引寻址模式而不是间接索引寻址模式来访问结构中的值.前者通常更快.
还有其他原因想要传递副本而不是引用,即您的函数将在结构中进行更改,而不会反映回调用者.虽然这通常是一种不好的做法,但使参数按值传递将确保调用者的视图不会被错误地更改.
现在对于你可能不想听到的部分答案:它通常没有那么大的差别!使用对程序语义最有意义的参数传递方法.如果您稍后发现特定区域存在性能瓶颈,那么请专注于提高性能.不要过度优化!
通过指针(或引用)传递对象并传递同一对象的副本具有不同的语义.如果您希望对对象进行的更改反映在函数调用之外,则需要引用语义,否则您需要值语义.
通常,值语义可以通过值传递值或通过const引用来表示
void value_semantics(my_obj obj); void value_semantics(const my_obj& obj);
然而,const引用方式也有一些缺点,它会阻止编译器可能进行的几个优化,因为对于具有普通构造函数的对象的别名问题,额外的间接级别(引用被实现为指针)可能超过避免的好处副本.
为了获得引用语义,您可以选择通过引用传递或通过指针传递,因为其他人已经说过引用比C++中的指针更自然(您不必使用运算符的地址&
)并且指针的唯一真正优势是如果要启用NULL值.
经验法则是,对于非平凡的类,您应该通过const引用传递,否则通过值传递.