English 中文(简体)
“const T &arg”诉“T arg”
原标题:"const T &arg" vs. "T arg"
  • 时间:2009-10-14 15:37:57
  •  标签:

以下几个例子中有哪些是宣布以下职能的最佳方式,以及为什么?

void myFunction (const int &myArgument);

void myFunction (int myArgument);
最佳回答

使用<条码>const T & arg [sizeof (T)>sizeof(ave*) [sizeof(T) <=(ave*

问题回答

They do different things. const T& makes the function take a reference to the variable. On the other hand, T arg will call the copy constructor of the object and passes the copy. If the copy constructor is not accessible (e.g. it s private), T arg won t work:

class Demo {
    public: Demo() {} 
    private: Demo(const Demo& t) { } 
};

void foo(Demo t) { }

int main() {
    Demo t;
    foo(t); // error: cannot copy `t`.
    return 0;
}

低温重视,如原始类型(如果所有事项都是物体的内容,而不是实际的参考特性;也就是说,它不是操作的或某件),一般倾向于。 对于你能够复制和/或保存参考身份的大型物体(不论大小)来说,最好通过提及。

<代码>T arg的另一个好处是,由于该编码带有拷贝,被点名人不能恶意改变原值。 它可以自由地改变与任何当地变量一样的变量,以开展工作。

摘自Move Constructionors。 我喜欢容易的规则。

  1. 如果该职能打算将这一论点作为副作用加以改变,则以提及/点名方式将之视为非目标。 例:

    void Transmogrify(Widget& toChange);
    void Increment(int* pToBump);
    
  2. 如果该职能没有改变其论点,而这种论点属于原始性质,则按价值计算。 例:

    double Cube(double value);
    
  3. 不适用

    3.1 。 如果该职能总是在内部提供其论点的副本,则按价值予以考虑。

    3.2. 如果该职能从未提供其论点的复印件,则参照行文。

    3.3. Added by me: 如果该功能有时复制件,那么就决定 feeling感: 如果复制几乎总是进行,则按价值计算。 如果复制件的完成时间为一半,则采用安全的方式,并参考线索。

就你而言,你应当以价值来看待,因为你无意改变这一论点,而这一论点是原始的。 我认为,“原始类型”既是一种非类别,又是一种没有用户定义的造物的类型,而<代码>sizeof(T)仅是一对 by。

公众建议说,应当根据即将通过的那类物质的实际规模来选择(“逐值”和“逐字参照”的通行方法。 即便在本次讨论中,你也有一个“正确”的答案,这确实表明了这一点。

实际上,根据您的决定,这种规模不仅不正确,而且是一种major,而且是一种明显的设计错误,暴露出严重缺乏对良好方案规划做法的分析/了解。

根据目标的实际执行决定,必须尽可能经常由汇编者作出。 在100个案例中,99个案例的工作完全会产生反效果。 (事实上,在C++语言的情况下,汇编者没有足够自由,可以相互交换使用这些方法,一般情况下,C++实际上无法相互交换。) 虽然如有必要,可通过模板元数据表进行适当规模的“半自动”方法选择,但情况不同。

在你撰写“手提”守则时选择通过法的更有意义的标准可能如下:

  1. 当你通过原子、单一、不可分割的实体时,如任何类型的单一非合计价值——一个编号、一个点、一个炉子——时,便宜通过“按价值计算”。 请注意,例如,变压器是合乎逻辑的单一数值。 因此,更喜欢通过激光器by Value<>m>,不管其实际规模是否大于(避免*)的大小。 (STL 执行确实是,BTW)。

  2. 当你通过任何种类的合计和复合价值时,便宜通过“参照”。 即,在逻辑层面暴露了明显“复合”性质的价值,即使其规模不超过(避免*)的大小。

两者之间的分离并不总是清楚的,但所有这些建议的区别总是如何。 此外,将实体分成“组别”和“组别”可能取决于贵方设计的具体内容,因此,该决定实际上可能不同于一种设计。

请注意,这一规则可能会产生与本讨论中提到的所谓“正确”规模方法不同的决定。

举例来说,观察一下的是,根据规模计算的方法,你将视其物理大小,对不同种类的变体采用不同的方法。 这一点尤其明显,大面积方法的利用如何。

良好方案拟订做法所依据的基本原则之一,是避免将你的决定建立在平台的物理特征之上(尽可能多)。 相反,你的决定必须基于贵方案内各实体的逻辑和概念性质(尽可能多)。 “按价值”或“参照”的传递问题在此并非例外。


在C++11中,将斜体移入语言,导致不同参数绕行方法的相对优先事项出现显著变化。 在某些情况下,通过甚至具有价值的综合物体可能完全可行。

C++11中的所有/最固定的职能是否应当作为接受普遍提及的功能模板来书写?

与民众和持之以恒的信仰相反,即使你再次通过大物体,也必然会更快地通过。 您不妨读到Dave Abrahams,最近的,。 关于这一主题。

Edit(主要针对Jeffhardy的评论): 事实是,在最大情况下,通过最常用的参考或许是“安全”的替代办法,但这并不意味着它永远是最好的事。 但是,为了了解这里讨论的内容,你确实需要仔细阅读Dave,因为那是相当技术性的,其结论背后的理由并不总是直观的(而且你需要理解作出明智选择的理由)。

通常就建筑类型而言,你只能通过价值。 它们是小规模的。

对于用户界定的类型(或模板,如果你不掌握将要通过的内容),则更喜欢混凝土。 参考的大小可能小于该类型的规模。 该公司还获得了额外的复印件(没有向影印机打电话)。

的确,......关于效率的其他答案是正确的。 但这里还有一些重要内容——通过按价值分类,产生复制件,从而援引复印件。 如果你回手ancy,那就又是使用参考材料的另一个原因。

提及“星号”并不值得打字。 th行的规则是,类别类型应当通过反向接受。 但是,对于变革者(可能是阶级的)来说,我们常常是一个例外。

在普通法典中,你或许应该写“T const&”大部分时间要安全。 http://www.boost.org/doc/libs/1_40_0/libs/utility/quest_traits.htm 你们可以用来选择最有希望的参数传递类型。 在我能够说明的范围内,它基本上使用对级类型和对等值的比值。

但也有这样的情况,即你可能希望按价值接受参数,而不论制作复印件的成本如何。 见Dave s article 。 低速度? 使用通行证。

简单类型,如斜体、双倍和果园,按价值予以通过是明智的。 对于较为复杂的类型,我使用“灯塔”,除非有具体理由不这样做。

穿过4至8个直径的费用与你一样低。 你们不会通过提及购买任何东西。 对较大种类而言,按价值进行转售可能是昂贵的。

它没有给静态带来任何变化,因为当你使用一个参考资料时,记忆地址仍然必须传承,记忆地址(避免*)通常涉及愤怒的规模。

对于包含大量数据的类型,其效率要高得多,因为它避免了巨大的间接费用不得不复制数据。

两者的区别是:一只穿透器(已涂 co),而一只使用现有的内线。 由于它有<条码>const参考资料,因此它没有变化,因此其作用大体相同。 这里的巨大差异是,这一功能可以改变当地面值,而不是<代码>const。 (I suppose some idiot can do the same mes with const_cast<>, or at minimumtries to.) 对于较大的目标,我可以认为有两种差别。

首先,有些物体只能复制,auto_ptr<>和含有这些物体的物体是明显的例子。

其次,对于大型和复杂的物体,它比复制件更快地通过<编码>const。 它通常不是一种大交易,而是通过<条码>const查询的物体是进入的有用习惯。

两人都做罚款。 不要浪费你对这一困境的担忧。

唯一可能产生差异的时期是,这种类型是巨大的障碍,而这种结构可能代价高昂,无法穿透。 在此情况下,作为指点或参考,通过“动力”会提高效率。

问题出现在你通过时。 如果你通过价值,将打电话给复印机。 如果您没有执行过,那么该标的复印件将交给该职务。

为什么这是一个问题? 如果你有动力地分配记忆,那么当要求复印人时(当物体离开功能范围时)可以释放。 然后,当你再次叫你的主子时,你可以有两倍的自由。

Moral: 撰稿人。





相关问题