gpt4 book ai didi

c++ - 为什么要在 C++ 中按值传递对象

转载 作者:IT老高 更新时间:2023-10-28 22:25:52 25 4
gpt4 key购买 nike

Possible Duplicate:
Is it better in C++ to pass by value or pass by constant reference?

我知道 C++ 中按值、指针和引用传递的区别,我认为在 C++ 中按值(而不是 const 引用)传递对象几乎总是一个编程错误。

void foo(Obj o); ... // Bad

void foo(const Obj &o); ... // Better

我能想到的唯一适合按值传递而不是 const 引用的情况是对象小于引用,因此按值传递更有效。

但是,这肯定是编译器旨在确定的事情吗?

为什么 C++ 实际上需要通过值传递和通过 const 引用传递,并且 - 如果适当,编译器是否允许自动将调用转换为(和从)const 引用?

(似乎有 100 多个 C++ 调用约定问题,询问(比如说)值和引用之间的差异 - 但我找不到一个问“为什么?”的问题。)

最佳答案

何时通过值传递可能比通过 const 引用更好的问题对于不同版本的标准有不同的答案。

在几年前的好老 C++03 中,建议是通过 const 引用传递任何不适合寄存器的内容。在这种情况下,答案是:

  • 因为Obj适合寄存器,传值和传值会更高效

仍然在 C++03 中,在过去的几年里(似乎有些文章在近 10 年前推荐了这个,但没有真正的共识),

  • 如果函数需要进行复制,那么如果复制的源是临时的,那么在接口(interface)中这样做允许编译器执行copy-elision,从而提高效率。

随着新的 C++11 标准的批准,以及对右值引用的编译器支持的增加,在许多情况下,即使拷贝不能被删除,并且再次

  • 如果函数需要进行复制,即使拷贝不能被删除,并且对于支持它的类型,内容将被移动(用常用术语object 将被移动,但只有内容被移动),这再次将比内部复制更有效。

至于为什么这两种不同的调用约定,它们有不同的目标。按值传递允许函数在不干扰源对象的情况下修改参数的状态。此外,源对象的状态也不会干扰函数(考虑多线程环境,以及在函数仍在执行时修改源的线程)。

关于c++ - 为什么要在 C++ 中按值传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com