Основной конструктор Копии, не вызванный

Это почти полагало, что плохая практика оптимизирует вещи как это при компиляции вниз в байт-код JVM. Sun javac действительно имеет некоторую основную оптимизацию, как делает scalac, groovyc, и т.д. Короче говоря, что-либо, что это является истинно определенным для языка, может быть оптимизирован в рамках компилятора. Однако вещи как это, которые, очевидно, изобретены так, чтобы быть агностиком языка, уменьшатся через просто из политики.

причина этого - он, позволяет HotSpot иметь намного более последовательное представление байт-кода и его шаблонов. Если компиляторы начинают слоняться без дела с пограничными случаями, который уменьшает способность VM оптимизировать общий случай, который не может быть очевидным во время компиляции. Steve Yeggie нравится к арфе на приблизительно этом: оптимизация часто легче , когда выполнено во времени выполнения умной виртуальной машиной. Он даже идет, насколько утверждать, что HotSpot разделяет оптимизацию javac. В то время как я не знаю, верно ли это, это не удивило бы меня.

Для суммирования: компиляторы, предназначающиеся для VMs, имеют совсем другой набор критериев, особенно в области оптимизации и когда это является соответствующим. Не идите, обвиняя разработчики компилятора в отъезде работы к far-more-capable JVM. Как указано несколько раз на этом потоке, современные компиляторы, предназначающиеся для собственной архитектуры (как gcc семья), чрезвычайно умны, производя неприлично быстрый код посредством некоторой очень умной оптимизации.

5
задан Jacob 1 October 2009 в 04:46
поделиться

6 ответов

Если вы хотите прочитать действующее правило, вам следует обратиться к стандарту C ++ 12.8 / 8:

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

  • если подобъект имеет тип класса, используется конструктор копирования для класса;
  • если подобъект является массивом, каждый элемент копируется таким образом соответствующий типу элемента;
  • если подобъект имеет скалярный тип, используется встроенный оператор присваивания.

Когда вы определяете конструктор копирования явно, вы должны явно вызвать c-tor копирования базового класса.

13
ответ дан 18 December 2019 в 05:27
поделиться

Я думаю, вам нужно явно вызвать конструктор базовой копии:

  Derived (Derived& d) : Base(d)
  {
      cout<<"Derived copy Constructor"<<endl;
      i = d.i; 
  }
16
ответ дан 18 December 2019 в 05:27
поделиться

В конструкторе копирования Derived вам нужно добавить следующее:

Derived (const Derived &d) : Base(d) { }
4
ответ дан 18 December 2019 в 05:27
поделиться

C ++ не работает любой вид «сопоставления конструкторов». Если вы явно не вызываете конструктор базового класса, вызывается конструктор по умолчанию (ну, технически подобъект базового класса - «значение инициализировано»,

2
ответ дан 18 December 2019 в 05:27
поделиться

Большое спасибо. Я понял. Это означает, что вызов конструктора копирования базового класса выполняется автоматически в конструкторе копирования по умолчанию производного класса. В то время как во втором случае, поскольку я пишу производный конструктор копирования, я должен сделать явный вызов конструктору копии базы. Еще раз спасибо

0
ответ дан 18 December 2019 в 05:27
поделиться

вы должны прочитать это : в нем объясняется, как работают наследование и специальные члены, такие как конструкторы.

1
ответ дан 18 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: