【问题标题】:c++ object initialization and constructor semanticsc++ 对象初始化和构造函数语义
【发布时间】:2013-05-23 22:31:09
【问题描述】:

对象的两种初始化有区别吗?

Object obj(constructor_arguments);

Object obj = Object(constructor_arguments);

请注意,第二次初始化并不打算使用new 运算符的指针。它旨在成为非堆变量。

在 GCC 中编译和工作都很好,我想知道是否真的有任何区别,或者两个语句在语义上是否相同。

【问题讨论】:

  • 查看是否存在实际差异的最佳方法是检查生成的汇编代码。第一次初始化更好,但如果让编译器发挥作用,第二个版本可能会针对相同的事情进行优化。
  • @MarcClaesen 这意味着查看生成的代码并不是最好的方法。事实上,这是最糟糕的方式(在这种情况下),因为它可能导致错误的结论。
  • @LuchianGrigore,我明白你的意思,但我会说这取决于问题(这在这方面是模棱两可的)。如果问题是“理论上哪个更有效?”,答案肯定是前者。如果问题是“哪个在实践中更有效?”在优化后它们很可能是等效的。

标签: c++ object constructor


【解决方案1】:

是的,有。第一个是直接初始化的语法,第二个是拷贝初始化。

理论上,第二个调用复制构造函数,但这需要优化。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多