0

我注意到,由于 RVO,大多数 C++ 专家总是建议最好按值传递。这让我不必太担心指针操作,也更容易编写代码。那里没有投诉。这让我想知道完全不使用动态内存分配(在堆上)并始终传递参数并按值返回结果是否是正确的方法?

这意味着不要提出这样的签名:

Character* getCharacter(Sprite *sprite, Action* action)

我应该或多或少地坚持以下签名:

Character getCharacter(Sprite sprite, Action action)

我的理解正确吗?还是我认为我解冻了一个putthy cath?

4

3 回答 3

1

他们每个人都有优点和缺点。请记住,使用“总是”之类的词是绝对的。只有黑暗面交易绝对。

因此,让我们看看每种方式以及何时使用它们。

  • 当传递的对象较小时(因为制作了本地副本),按值传递是好的。如果您想确保不会意外更改原始数据,这也很好。它的缺点是它会制作本地副本,如果它真的很大,那可能会很糟糕。
  • 通过引用传递只传递一个内存地址。因此,较大的物体可以通过相对较小的占地面积。此外,通过参考,您可以修改原件(这有好有坏)。这使您能够“返回”多个变量(可以这么说)。很明显,这里的大问题是您可能会错误地更改原始数据。
  • 经常通过引用传递被普遍认为是做事的一个非常强大的候选者。它具有引用传递和价值传递的优点。占用空间小,因为它是参考并且您无法更改原始文件。对于您在方法中对变量的使用需要稍微改变这一事实,并没有太多的缺点可以接受。请记住,它是一个常量,因此不能在函数中修改。

请记住,没有灵丹妙药。没有什么总是更好的。确定您需要什么并为工作选择合适的工具。

编辑:也有人说过。传递不等于动态分配。动态分配只发生在“new”关键字上。我的建议是暂时避免使用“new”关键字,直到您对参数和指针有了更好的理解。

于 2013-05-31T19:58:34.120 回答
1

您是否在堆上分配对象通常由以下问题之一驱动:

  1. 如果新对象需要比创建它的函数寿命更长,则必须在堆上分配该对象。
  2. 如果对象非常大,并且堆不下,那么您必须在堆上分配它。

除此之外,按值传递或按引用传递的选择由语义决定。如果要对副本进行操作,请按值传递。如果要对实际对象进行操作,请通过引用传递。

于 2013-05-31T20:11:12.000 回答
1

你的说法完全不真实。在函数将参数复制到局部变量的特殊情况下,有一些简单的建议是通过值而不是主流的 const-ref 传递。

而对于通过非常量指针传递,按值传递从来都不是一种选择。第一个意味着可选的输出或输入参数,第二个和输入参数。

问题标题中提到的动态分配与内容不符。

你的理解肯定不正确。

于 2013-05-31T20:38:34.343 回答