2

问题如标题所示。

例如:

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

或者

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

哪个更有效率?

编辑:尽管除非重复执行,否则没有显着差异,但我仍然想知道,我宁愿想要答案而不是意见 - 正如 stackoverflow 的指南所建议的那样。

4

4 回答 4

5

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

其次,这不是 Qt 的问题,它通常适用于 C++。

在没有任何关于您正在创建的类的先验知识的情况下,您可以确定一件事:带参数的构造函数 version至少与 setter version 一样有效

这是因为,在最坏的情况下,构造函数可能如下所示:

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
}
于 2011-12-18T01:32:29.280 回答
1

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

在调用方方面,如果所有适当的参数都已经在创建对象的地方,那么单个调用会更明显地表明,实际上,所有参数“属于”该对象,并且它是“在一个”中创建的片”。另一方面,如果使用单个调用意味着调用代码必须随着时间的推移收集参数,然后吐出一个“被压抑”的调用,那么创建对象然后设置相应的属性可能是更好的选择一次一个,随着他们的价值观的发展。

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

(这里有一些重要的事实是 C++ 没有实现真正的关键字参数,所以当参数列表超过 4-5 项时,人们会失去对哪个参数是哪个参数的智能控制,特别是如果有多种形式的构造函数。在这样的使用单独的属性设置器的案例给出了关键字参数的(粗略)效果并减少了混淆的机会。)

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

于 2011-12-18T03:16:45.890 回答
0

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

于 2011-12-18T01:29:54.207 回答
0

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

于 2011-12-18T01:31:41.987 回答