Является ли "MyClass a (anotherInstance);"быстрее, чем "MyClass a = anotherInstance;"? - PullRequest
0 голосов
/ 26 декабря 2011

Я сейчас перерабатываю код коллеги.Мне кажется, что он часто использует синтаксис, такой как

double a(anotherDouble);  --- A

вместо

double a = anotherDouble;  --- B

Мне интересно, если его синтаксис быстрее, может, метод A может сохранить операцию конструктора?

Может ли кто-нибудь немного рассказать об этом здесь?

спасибо и хорошего сезона отпусков!

Ответы [ 4 ]

1 голос
/ 26 декабря 2011

В этом случае оператор присваивания не вызывается вообще. A a = b; всегда вызывает конструктор. Если b имеет объект типа A, вызывается конструктор копирования. Если b является объектом другого типа B, то вызывается подходящий конструктор, например A( const B& ). При любых обстоятельствах A a(b); и A a = b; приведут к абсолютно одинаковому коду с одним и тем же конструктором, вызванным один раз.

Следующее НЕ будет компилироваться, поскольку подходящего конструктора не существует, хотя для класса TB есть подходящий оператор присваивания и конструктор по умолчанию:

#include <iostream>    

class TA
{
 public:
  TA()
  {
   std::cout << "TA()" << std::endl;
  }
  TA( const TA& )
  {
   std::cout << "TA(const TA&)" << std::endl;
  }
};

class TB
{
 public:
  TB()
  {
   std::cout << "TB()" << std::endl;
  }
  TB( const TB& )
  {
   std::cout << "TB(const TB&)" << std::endl;
  }
  TB& operator=( const TA& )
  {
   std::cout << "TB& operator=( const TA& )" << std::endl;
   return ( *this );
  }

};

int main( void )
{
 TA la;
 TB lb = la;

 return ( 0 );
}

Так что ответ на ваш вопрос «Нет, это не быстрее, это на 100% то же самое» .

1 голос
/ 26 декабря 2011

Для double (или некоторого предопределенного типа) это не должно иметь значения.Я считаю double pi=3.14; более читабельным, чем double pi(3.14);, но это дело вкуса.

Для определенного пользователем class C написание C x = C(3); может включать конструктор для инициализации и другой для копирования, но иногдаоптимизировано компилятором.

1 голос
/ 26 декабря 2011

Для встроенного типа данных double они одинаковы, разницы в производительности нет.

В случае пользовательских классов.
Первый - Прямая инициализация , а второй - Копировать инициализацию .

Хорошее чтение:

Есть ли разница между инициализацией копирования и прямой инициализацией

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

double это не класс для начала. Но, во всяком случае, я никогда не видел компилятор, который генерирует разный код для этих двух конструкций, даже с классами, они генерируют эквивалентный код, и стандарт утверждает это явно.

...