Что более эффективно в Qt: конструкторы с аргументами или конструкторы по умолчанию с установщиками впоследствии? - PullRequest
2 голосов
/ 18 декабря 2011

Вопрос как в названии.

Например:

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

или

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

Что эффективнее?

отредактируйте: хотя это не имеет существенной разницы, если не сделано повторно, я все еще хотел бы знать, я скорее хотел бы получить ответы, чем мнения - как подсказывают рекомендации stackoverflow.

Ответы [ 4 ]

5 голосов
/ 18 декабря 2011

Во-первых, почему new в первом примере?Я предполагаю, что вы создадите обе переменные в одном хранилище (куча / стек).

Во-вторых, это не вопрос Qt, это относится к C ++ в целом.

Без каких-либо предварительных знаний о классе, который вы создаете, вы можете быть уверены в одном: Конструктор с аргументами версии по крайней мере так же эффективен, как и версия сеттера .

Это потому, что в худшем случае конструктор может выглядеть так:

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
}
1 голос
/ 18 декабря 2011

Что касается того, является ли один или три вызова (хорошо, 2,5, поскольку первый вызов неявным) "лучше" (игнорируя проблему с кучей), стоит задуматься о концептуальном ходе программы и о вашем интеллектуальном контроле над ней.Это.И также стоит рассмотреть практические вопросы, связанные с кодированием.

На стороне вызывающей стороны, если все соответствующие параметры уже находятся под рукой, где создается объект, то один вызов делает более очевидным, что, действительно,все параметры «принадлежат» этому объекту, и он создается «одним куском».С другой стороны, если использование одного вызова означает, что вызывающий код должен собирать параметры с течением времени, а затем выплевывать один «отложенный» вызов, тогда может быть лучшим выбором создать объект и затем установить соответствующие свойства.по одному, по мере того, как их значения развиваются.

И, на стороне вызываемого, могут быть практические соображения.Например, может быть, что существует дюжина свойств, при разных вариантах использования объекта могут использоваться разные комбинации.Вместо того, чтобы предоставлять десятки различных конструкторов, предоставление одного конструктора (или небольшого их числа) в сочетании с несколькими установщиками свойств является более эффективным с точки зрения времени программиста и менее склонным вводить в заблуждение пользователя объекта.Но если (почти) всегда используется одна и та же комбинация относительно небольшого количества параметров, то, вероятно, лучше использовать ресурсы одного программиста.

(Здесь важно то, что C ++ не реализуетИстинные параметры ключевых слов, поэтому, когда списки параметров выходят за рамки 4-5 элементов, один теряет интеллектуальный контроль над тем, какой параметр какой, особенно если существует несколько форм конструктора. В таком случае использование отдельных установщиков свойств дает (грубый) эффект ключевого словапараметры и снижает вероятность путаницы.)

Эффективность не всегда о циклах процессора.Эффективное использование времени программиста (включая сокращение времени на отладку) во многих отношениях намного важнее.

0 голосов
/ 18 декабря 2011

Ты сравниваешь яблоки и апельсины. В первом случае вы создаете объект из кучи, а во втором случае вы создаете объект «на месте», в другом объекте или в автоматическом хранилище, так что нет затрат на кучу. Не имеет никакого отношения к тому, используете ли вы один вызов конструктора или (неявный) конструктор плюс два сеттера.

0 голосов
/ 18 декабря 2011

При прочих равных один вызов функции лучше, чем 3.

...