Это почти полагало, что плохая практика оптимизирует вещи как это при компиляции вниз в байт-код JVM. Sun javac
действительно имеет некоторую основную оптимизацию, как делает scalac
, groovyc
, и т.д. Короче говоря, что-либо, что это является истинно определенным для языка, может быть оптимизирован в рамках компилятора. Однако вещи как это, которые, очевидно, изобретены так, чтобы быть агностиком языка, уменьшатся через просто из политики.
причина этого - он, позволяет HotSpot иметь намного более последовательное представление байт-кода и его шаблонов. Если компиляторы начинают слоняться без дела с пограничными случаями, который уменьшает способность VM оптимизировать общий случай, который не может быть очевидным во время компиляции. Steve Yeggie нравится к арфе на приблизительно этом: оптимизация часто легче , когда выполнено во времени выполнения умной виртуальной машиной. Он даже идет, насколько утверждать, что HotSpot разделяет оптимизацию javac. В то время как я не знаю, верно ли это, это не удивило бы меня.
Для суммирования: компиляторы, предназначающиеся для VMs, имеют совсем другой набор критериев, особенно в области оптимизации и когда это является соответствующим. Не идите, обвиняя разработчики компилятора в отъезде работы к far-more-capable JVM. Как указано несколько раз на этом потоке, современные компиляторы, предназначающиеся для собственной архитектуры (как gcc
семья), чрезвычайно умны, производя неприлично быстрый код посредством некоторой очень умной оптимизации.
Если вы хотите прочитать действующее правило, вам следует обратиться к стандарту C ++ 12.8 / 8:
Неявно определенный конструктор копирования для класса X выполняет поэлементное копирование своих подобъектов. В порядок копирования такой же, как порядок инициализации баз и членов в определяемой пользователем конструкции. tor (см. 12.6.2). Каждый подобъект копируется способом, соответствующим его типу:
- если подобъект имеет тип класса, используется конструктор копирования для класса;
- если подобъект является массивом, каждый элемент копируется таким образом соответствующий типу элемента;
- если подобъект имеет скалярный тип, используется встроенный оператор присваивания.
Когда вы определяете конструктор копирования явно, вы должны явно вызвать c-tor копирования базового класса.
Я думаю, вам нужно явно вызвать конструктор базовой копии:
Derived (Derived& d) : Base(d)
{
cout<<"Derived copy Constructor"<<endl;
i = d.i;
}
В конструкторе копирования Derived
вам нужно добавить следующее:
Derived (const Derived &d) : Base(d) { }
C ++ не работает любой вид «сопоставления конструкторов». Если вы явно не вызываете конструктор базового класса, вызывается конструктор по умолчанию (ну, технически подобъект базового класса - «значение инициализировано»,
Большое спасибо. Я понял. Это означает, что вызов конструктора копирования базового класса выполняется автоматически в конструкторе копирования по умолчанию производного класса. В то время как во втором случае, поскольку я пишу производный конструктор копирования, я должен сделать явный вызов конструктору копии базы. Еще раз спасибо
вы должны прочитать это : в нем объясняется, как работают наследование и специальные члены, такие как конструкторы.