这是更有效的Qt:构造函数与参数或默认构造函数与setter之后
Which is more efficient in Qt: constructors with arguments or default constructors with setters afterwards?
问题和标题一样
例如: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无关。
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在按值调用 (c++) 中转发构造函数参数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 如何在构造函数参数中初始化"std::set"?
- 何时应在构造函数参数中使用 const C++?
- 使用模板化结构作为构造函数参数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 如何使输入文本文件成为构造函数参数?c++
- shared_ptr构造函数参数是否应按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 复制构造函数参数为0
- 用作成员构造函数参数的函数的求值顺序
- 结构中的默认成员值或默认构造函数参数
- C++将引用成员绑定到构造函数参数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 模板函数指针参数与构造函数参数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何基于构造函数参数模板化类成员函数的代码
- 将派生类构造函数参数传递给受保护的成员
- 如何根据构造函数参数使用超类类型初始化成员变量?