gpt4 book ai didi

c++ - 在形式参数列表中自动使用 const 和按引用传递有什么明显的后果?

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:08 25 4
gpt4 key购买 nike

在过去一年左右的时间里,我更多地依靠自己进行开发。我发现自己在形式参数列表中尽可能多地使用 const& 。我不确定我是怎么养成这个习惯的,但除非我试图改变我发送的值,否则我会自动给它 const 并且我几乎完全停止了按值传递.我不确定为什么。自动执行此操作会产生明显的后果吗?我假设执行时间可能存在一些问题,但不完全确定。我知道编程没有硬性规定,但是对此有什么建议吗?自动使用 const 并尽可能通过引用传递是错误的吗?或者我应该默认为按值传递?

最佳答案

对于内置类型(intboolcharsize_tdouble 等)和指针类型(int*char* 等):

  • 按值传递。通过 const 引用传递它们没有性能优势,它只是为编译器增加了额外的优化工作。有人喜欢加const按值传递喜欢void f(const int x) .这可以防止以弄乱界面为代价意外修改函数内部的值。
  • Except,通过非常量引用传递如果被调用者将修改它,这对调用者来说是清楚的。这基本上只用于模拟返回多个值的函数。

对于类类型的对象( classstruct ):

  • 通过 const 引用传递(const std::string&, const std::vector<T>&const MyClassOrStruct&),如果 (1) 被调用者不需要修改它,并且 (2) 被调用者不会持有引用在调用者销毁它之后。这可能是非内置的最常见情况。
  • 通过非常量引用传递如果 (1) 被调用者确实需要修改它,(2) 被调用者不会在调用者之后保留引用已经销毁了它,并且 (3) 调用者清楚传递的对象将被修改。
  • 按值传递如果需要复制对象,并且知道您正在为复制付出代价。对于小型的类似结构的类型(例如 std::pair<int, int>),通常按值传递是可以的。对于较大的类,您需要查看您的特定用例。
  • 通过移动传递 如果您不再需要原始对象并希望将所有权转移给您正在调用的函数。这通常比拷贝便宜,但仍然有成本。一般通过 lambda 和 std::function如果可能的话,通过移动。
  • 传递 std::shared_ptr<T>按值 如果您想按引用传递,除了被调用者确实需要在调用者销毁引用后保留引用。
  • 传递 std::unique_ptr<T>通过移动如果你想通过移动传递,除非移动构造函数很昂贵,或者由于某种原因你需要对象留在原地。

关于c++ - 在形式参数列表中自动使用 const 和按引用传递有什么明显的后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45047356/

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