当前位置:  开发笔记 > 编程语言 > 正文

功能参数:复制还是指针?

如何解决《功能参数:复制还是指针?》经验,为你挑选了2个好方法。

我是C++的新手并且有一些问题,这是其中之一.

有没有什么理由当你使用一个函数来接受一个或几个参数时,你知道的参数将始终存储在函数调用之前的变量中,以传递变量的副本,而不是指向变量的指针?

我在谈论表现.在我看来,传递整个结构的副本而不仅仅是一个指针(4个字节)需要更多的资源.



1> 小智..:

有几种方法可以传递副本比传递指针更便宜.

    对象等于或小于指针.直接访问值总是比取消引用指针更快.

    结构足够小,可以由编译器放在堆栈上.在这种情况下,通过索引寻址模式而不是间接索引寻址模式来访问结构中的值.前者通常更快.

还有其他原因想要传递副本而不是引用,即您的函数将在结构中进行更改,而不会反映回调用者.虽然这通常是一种不好的做法,但使参数按值传递将确保调用者的视图不会被错误地更改.

现在对于你可能不想听到的部分答案:它通常没有那么大的差别!使用对程序语义最有意义的参数传递方法.如果您稍后发现特定区域存在性能瓶颈,那么请专注于提高性能.不要过度优化!



2> Motti..:

通过指针(或引用)传递对象并传递同一对象的副本具有不同的语义.如果您希望对对象进行的更改反映在函数调用之外,则需要引用语义,否则您需要值语义.

通常,值语义可以通过值传递值或通过const引用来表示

void value_semantics(my_obj obj);
void value_semantics(const my_obj& obj);

然而,const引用方式也有一些缺点,它会阻止编译器可能进行的几个优化,因为对于具有普通构造函数的对象的别名问题,额外的间接级别(引用被实现为指针)可能超过避免的好处副本.

为了获得引用语义,您可以选择通过引用传递或通过指针传递,因为其他人已经说过引用比C++中的指针更自然(您不必使用运算符的地址&)并且指针的唯一真正优势是如果要启用NULL值.

经验法则是,对于非平凡的类,您应该通过const引用传递,否则通过值传递.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有