这是更有效的Qt:构造函数与参数或默认构造函数与setter之后

Which is more efficient in Qt: constructors with arguments or default constructors with setters afterwards?

本文关键字:构造函数 参数 默认 之后 setter 有效 Qt      更新时间:2023-10-16

问题和标题一样

例如:

QPropertyAnimation *animation;
animation = new QPropertyAnimation(this, "windowOpacity", this);

QPropertyAnimation animation;
animation.setTargetObject(this);
animation.setPropertyName("windowOpacity");
animation.setParent(this);

哪个更有效?

编辑:虽然它没有明显的区别,除非反复做,我仍然想知道,我宁愿要答案而不是意见-作为stackoverflow的指导方针建议。

首先,为什么在第一个例子中是new ?我将假设您将在相同的存储(堆/堆栈)上创建这两个变量。

第二,这不是Qt的问题,它适用于一般的c++。

在没有任何关于你正在创建的类的先验知识的情况下,你可以确定一件事:带参数版本的构造函数至少与setter版本一样高效。这是因为,在最坏的情况下,构造函数可能像这样:

QPropertyAnimation(QObject* target, const QByteArray & prop_name, QObject* parent = 0)
{
  // members are default initializer, now explicitly set
  this->setTargetObject(target);
  this->setPropertyName(prop_name);
  this->setParent(parent)
}

然而,任何至少读过一本好书的人都会这样写构造函数:

QPropertyAnimation(QObject* target, const QByteArray & prop_name, QObject* parent = 0)
  : m_target(target)
  , m_prop_name(prop_name)
  , m_parent(parent)
{
  // members explicitly initialized
}

至于一个调用还是三个调用(好,2.5,因为第一个调用是隐式的)"更好"(忽略堆问题),值得考虑程序的概念流,以及对它的智力控制。与编码相关的实际问题也值得考虑。

在调用方,如果在创建对象的地方已经有了所有适当的参数,那么单个调用就会更明显地表明,所有参数确实"属于"该对象,并且它是"一体"创建的。另一方面,如果使用单个调用意味着调用代码必须随着时间的推移收集参数,然后产生单个"被压抑"的调用,那么创建对象然后在开发其值时一次设置相应的属性可能是更好的选择。

并且,在被调用方,可能有实际的考虑。例如,可能有十几个属性,对象的不同用途可能使用不同的组合。与其提供几十个不同的构造函数,不如提供一个构造函数(或几个构造函数)结合多个属性设置器,这样既节省了程序员的时间,又不容易让对象的用户感到困惑。但是,如果(几乎)总是使用相对较少的参数的相同组合,那么单个调用可能是对程序员资源的更好利用。

(这里有些重要的事实是c++没有实现真正的关键字参数,所以当参数列表超过4-5项时,就失去了对参数的智能控制,特别是当有几种形式的构造函数时。在这种情况下,使用单独的属性设置可以(粗略地)达到关键字参数的效果,并减少混淆的机会。

效率并不总是与CPU周期有关。在许多方面,有效利用程序员的时间(包括减少调试时间)要重要得多。

在其他条件相同的情况下,一个函数调用比3个要好。

你在比较苹果和橘子。在第一种情况下,您是从堆中构造对象,而在第二种情况下,您是"就地"构造对象,在另一个对象或自动存储中构造对象,因此没有堆开销。与是否使用单个构造函数调用或(隐式)构造函数加两个setter无关。