Anatoly
сконструированы два объекта Point и инициализирована ссылка p2
Anatoly
это все что там может быть
Ivan
Ivan
Фиолетовые это const Point& P2 = Point ();
Ivan
gcc7.1
Anatoly
ссылка реализуется указателем, как раз ты видишь его инициализацию
Anatoly
первых три мува - конструирование временного объекта
Anatoly
потом иницилизация ссылки lea + mov
Ivan
Ну ок. А выше жёлтый просто Point P1 = Point ();
Anatoly
салатным
Ivan
Всего три mov'a
Anatoly
да, конструирование p1
Anatoly
а после розовым putchar
Aidar
инициализация
Ivan
Но, справедливости ради в clang 4.0 const reference занимает меньше инструкций
Anatoly
на логическом уровне будет все то что я описал выше
Arseny
Еще есть типичная ошибка:
const string& f(const string &x) {return x;}
const string &tmp = f(string("hello"));
Вот так писать не стоит.
Anatoly
конструирование p1, конструирование временного объекта, инициализация ссылки
Anatoly
так и не скомпилируется
Anatoly
это только MSVC хавает
Anatoly
и позволяет иницилизировать не константную ссылку временным объектом
Arseny
Там было маловато const-ов.
Anatoly
да, это совсем другой пример
Ivan
Короче, для примитивных типов нет разницы
Anatoly
Ivan
В смысле, нет смысла так делать
Anatoly
ну, получается ни к чему, а и то просто больше памяти на стеке заберет ссылка, нежели чем примитивный типа
Ivan
Но погодите, разве Point p = Point(), не то же самое, что и Point p{};
Anatoly
тоже, в чем вопрос?
Anatoly
ссылка в памяти представлена указаталем, там лежит адрес временного объекта
Ivan
А смысл от временного объекта? Если можно создать не временный? Дешевле будет, так как ссылку хранить не надо
Anatoly
когда не было move семантики, часто таким образом обходили тяжеловестные конструкторы копирования, убирая лишнее копирование
Ivan
Аааааааааааааааа
Ivan
Ну всё.
Ivan
То есть раньше это разные вещи были
Ivan
Но погодите, разве Point p = Point(), не то же самое, что и Point p{};
Ivan
Но сейчас то всё ок
Anatoly
погоди, не въехал о чем ты здесь справшиваешь
Point p = Point(), не то же самое, что и Point p{};
Ivan
Да там только три поля инта
Anatoly
и как это коррелирует с вопросом о продлении жизни временного объекта
Ivan
Ну я вот сейчас смотрел ассемблерный код без оптимизаций он идентичен
Ivan
Я имел ввиду, что можно создать не временный объект. Это будет дешевле
Berkus
Constantine
не знаю, не бага ли это MSC, но
Some object = <expression>
не отработает, если Some(decltype(<expression>)) помечен как explicit
Berkus
https://dl.dropboxusercontent.com/s/wblfh4pwouyybxj/2017-06-22%20at%2017.55.png сахарок-сахарок )
Constantine
Anatoly
здесь, мне кажется, расжевали это момент http://en.cppreference.com/w/cpp/language/copy_elision
Anatoly
Notes
Copy elision is the only allowed form of optimization (until C++14)one of the two allowed forms of optimization, alongside allocation elision and extension, (since C++14) that can change the observable side-effects. Because some compilers do not perform copy elision in every situation where it is allowed (e.g., in debug mode), programs that rely on the side-effects of copy/move constructors and destructors are not portable.
Except where noted above, even when copy-elision takes place and the copy-/move-constructor is not called, it still must be present and accessible (as if no optimization happened at all), otherwise the program is ill-formed.
Constantine
действительно так, забавно
Constantine
я всегда был уверен, что конструкция, похожая на присваивание в инициализации, просто воспринимается компилятором как инициализация
Александр
https://wandbox.org/permlink/hH4Yex2ASPrzIAb0
Александр
сравните результат для C++14 и C++17
Александр
наглядно очень
Anatoly
это был дефект компилятора, который игнорировал запрещение копирования
Anatoly
по-моему я в MSVC встречал это
Anonymous
Ребята кто может помочь
Berkus
Berkus
если каждые 5-6 часов повторять эту тему будет круто
Anatoly
тебе уже помогли, ты теперь делаешь вид, что все в порядке вещей
Декодер (лысый)
не подскажите как поменять кодировку текста в CLR?
Anonymous
Anonymous
Ребята у меня в коде ошибка как ее решить можно быть дело в компиляторе
Anonymous
?
Vlad
Anatoly
T c = T() - полная цепочка ctor + copyctor
Constantine
по-моему я в MSVC встречал это
я проверил, если написать в MSC 14
struct Some {
Some() = default;
Some(Some const&) = delete;
};
void f() {
Some object = Some(); //CE
}
Anatoly
по-моему это было VS 2010
Anatoly
значит починили
Constantine
ну copy elision возврата функции работал еще в VS 2003
Constantine
у нас на это был тест и жесткая завязка
Anatoly
я не о работе copy ellision, а о детекте отсутствия копирующего конструктора
Anatoly
в этом был дефект
Constantine
а, это лень проверять)
Constantine
не очевидно, почему эта конструкция не признается равнозначной вызову конструктора с точностью до explicit
Constantine
как я понимаю, проверка делается на существование copy или move конструктора
Constantine
после чего он не вызывается)
Anatoly
да