Сообщение Re[94]: Когда это наконец станет defined behavior? от 21.08.2023 17:21
Изменено 21.08.2023 17:23 vdimas
Re[94]: Когда это наконец станет defined behavior?
Здравствуйте, σ, Вы писали:
V>>>>Согласно семантике — два.
σ>>>Да нет, согласно семантике — один.
V>>Два.
σ>Симптоматично, что ни одного пруфа от тебя до сих пор не было.
Чем исходник не пруф?
V>>В этом суть оптимизации.
V>>Точно такая же происходит здесь:
V>>
V>>Согласно семантике, создаётся временный безымянный объект и копируется (либо перемещается) в целевую переменную obj.
σ>Или не создаётся и не копируется
А ты проверял?
Поиграй с раскомментированием строчек в различных сочетаниях.
σ>тоже «согласно семантике», а не «способу реализации»
Семантика описана простейшим исходником, который я ХЗ как можно было не суметь прочитать.
Если же ты опять пытаешься озвучить свою "эрудицию", то ты ошибся стадией рассуждения об исходнике — оптимизация выполняется над изначальной неоптимизированной моделью кода, и в этой модели кода должен быть доступен конструктор копирования, которого после оптимизации не будет. Но он всё-равно нужен просто в декларации.
Ну и, в дебаге обычно полное повторение описанного в коде безо-всякий оптимизаций.
V>>Лишнего копирования/перемещения можно избежать.
V>>При возврате по значению применяется ровно та же логика.
σ>Только при возврате по значению может быть несколько переменных с разной константностью
И какая разница, если оперируем данными по значению?
Семантически в этом случае создаются копии объектов.
А упоминание об обязательности RVO — это ж для дурачка-программиста, а не для компилятора, потому что с С++17 RVO будет использовано в любом случае, даже если конструкторы/деструкторы имеют побочные эффекты.
Выделенное — это для тебя, программиста, чтобы ты потом не задавал вопросов "а почему так?".
(Впрочем, в это уже тыкал, пошли по кругу)
σ>И тогда возникают некоторые вопросы.
Странные у тебя какие-то вопросы, которые ты не в состоянии даже просто сформулировать на 20-й итерации.
σ>Но даже если бы было и только — какая разница?
Никакой, бо оптимизация не изменяет семантику.
А даже если случилось RVO, то мы имеем дело с одной областью памяти, но с разными ссылками на неё в разные моменты работы программы, но никогда одновременно.
(Опять по кругу в тебя этим тыкают)
ХЗ, кароч...
Если сложно с пониманием передачи данных по значению, попробуй порассуждать про передачу через ссылочную семантику:
Тут оператор new создаёт в куче неконстантный объект и возвращает неконстантный указатель на этот объект, где значение неконстантного указателя копируется в константный указатель obj.
Надеюсь, хотя бы с примитивными типами данных сложности понимания не возникают — каким образом мы копируем числовое значение неконстантного указателя в константный? ))
А если обернуть числовое значение в некий класс SomeObj, ы?
Неужели понимать становится сложнее? ))
V>>>>Согласно семантике — два.
σ>>>Да нет, согласно семантике — один.
V>>Два.
σ>Симптоматично, что ни одного пруфа от тебя до сих пор не было.
Чем исходник не пруф?
V>>В этом суть оптимизации.
V>>Точно такая же происходит здесь:
V>>
σ>const SomeObj obj = SomeObj(args);
σ>V>>Согласно семантике, создаётся временный безымянный объект и копируется (либо перемещается) в целевую переменную obj.
σ>Или не создаётся и не копируется
А ты проверял?
class SomeObj {
public:
SomeObj(int) {}
//SomeObj(const SomeObj &) = delete;
};
//const SomeObj obj = SomeObj(42);
const SomeObj obj2(42);Поиграй с раскомментированием строчек в различных сочетаниях.
σ>тоже «согласно семантике», а не «способу реализации»
Семантика описана простейшим исходником, который я ХЗ как можно было не суметь прочитать.
Если же ты опять пытаешься озвучить свою "эрудицию", то ты ошибся стадией рассуждения об исходнике — оптимизация выполняется над изначальной неоптимизированной моделью кода, и в этой модели кода должен быть доступен конструктор копирования, которого после оптимизации не будет. Но он всё-равно нужен просто в декларации.
Ну и, в дебаге обычно полное повторение описанного в коде безо-всякий оптимизаций.
V>>Лишнего копирования/перемещения можно избежать.
V>>При возврате по значению применяется ровно та же логика.
σ>Только при возврате по значению может быть несколько переменных с разной константностью
И какая разница, если оперируем данными по значению?
Семантически в этом случае создаются копии объектов.
А упоминание об обязательности RVO — это ж для дурачка-программиста, а не для компилятора, потому что с С++17 RVO будет использовано в любом случае, даже если конструкторы/деструкторы имеют побочные эффекты.
Выделенное — это для тебя, программиста, чтобы ты потом не задавал вопросов "а почему так?".
(Впрочем, в это уже тыкал, пошли по кругу)
σ>И тогда возникают некоторые вопросы.
Странные у тебя какие-то вопросы, которые ты не в состоянии даже просто сформулировать на 20-й итерации.
σ>Но даже если бы было и только — какая разница?
Никакой, бо оптимизация не изменяет семантику.
А даже если случилось RVO, то мы имеем дело с одной областью памяти, но с разными ссылками на неё в разные моменты работы программы, но никогда одновременно.
(Опять по кругу в тебя этим тыкают)
ХЗ, кароч...
Если сложно с пониманием передачи данных по значению, попробуй порассуждать про передачу через ссылочную семантику:
const SomeObj * obj = new SomeObj(42);Тут оператор new создаёт в куче неконстантный объект и возвращает неконстантный указатель на этот объект, где значение неконстантного указателя копируется в константный указатель obj.
Надеюсь, хотя бы с примитивными типами данных сложности понимания не возникают — каким образом мы копируем числовое значение неконстантного указателя в константный? ))
А если обернуть числовое значение в некий класс SomeObj, ы?
Неужели понимать становится сложнее? ))
Re[94]: Когда это наконец станет defined behavior?
Здравствуйте, σ, Вы писали:
V>>>>Согласно семантике — два.
σ>>>Да нет, согласно семантике — один.
V>>Два.
σ>Симптоматично, что ни одного пруфа от тебя до сих пор не было.
Чем исходник не пруф?
V>>В этом суть оптимизации.
V>>Точно такая же происходит здесь:
V>>
V>>Согласно семантике, создаётся временный безымянный объект и копируется (либо перемещается) в целевую переменную obj.
σ>Или не создаётся и не копируется
А ты проверял?
Поиграй с раскомментированием строчек в различных сочетаниях.
σ>тоже «согласно семантике», а не «способу реализации»
Семантика описана простейшим исходником, который я ХЗ как можно было не суметь прочитать.
Если же ты опять пытаешься озвучить свою "эрудицию", то ты ошибся стадией рассуждения об исходнике — оптимизация выполняется над изначальной неоптимизированной моделью кода, и в этой модели кода должен быть доступен конструктор копирования, которого после оптимизации не будет. Но он всё-равно нужен просто в декларации.
Ну и, в дебаге обычно полное повторение описанного в коде безо-всякий оптимизаций.
V>>Лишнего копирования/перемещения можно избежать.
V>>При возврате по значению применяется ровно та же логика.
σ>Только при возврате по значению может быть несколько переменных с разной константностью
И какая разница, если оперируем данными по значению?
Семантически в этом случае создаются копии объектов.
А упоминание об обязательности RVO — это ж для дурачка-программиста, а не для компилятора, потому что с С++17 RVO будет использовано в любом случае, даже если конструкторы/деструкторы имеют побочные эффекты.
Выделенное — это для тебя, программиста, чтобы ты потом не задавал вопросов "а почему так?".
(Впрочем, в это уже тыкал, пошли по кругу)
σ>И тогда возникают некоторые вопросы.
Странные у тебя какие-то вопросы, которые ты не в состоянии даже просто сформулировать на 20-й итерации.
σ>Но даже если бы было и только — какая разница?
Никакой, бо оптимизация не изменяет семантику.
А даже если случилось RVO, то мы имеем дело с одной областью памяти, но с разными ссылками на неё в разные моменты работы программы, но никогда одновременно.
(Опять по кругу в тебя этим тыкают)
ХЗ, кароч...
Если сложно с пониманием передачи данных по значению, попробуй порассуждать про передачу через ссылочную семантику:
Тут оператор new создаёт в куче неконстантный объект и возвращает неконстантный указатель на этот объект, где значение неконстантного указателя копируется в константный указатель obj.
Надеюсь, хотя бы с примитивными типами данных сложности понимания не возникают — каким образом мы копируем числовое значение неконстантного указателя в константный? ))
А если обернуть числовое значение в некий класс SomeObj, ы?
Неужели понимать становится сложнее? ))
V>>>>Согласно семантике — два.
σ>>>Да нет, согласно семантике — один.
V>>Два.
σ>Симптоматично, что ни одного пруфа от тебя до сих пор не было.
Чем исходник не пруф?
V>>В этом суть оптимизации.
V>>Точно такая же происходит здесь:
V>>
σ>const SomeObj obj = SomeObj(args);
σ>V>>Согласно семантике, создаётся временный безымянный объект и копируется (либо перемещается) в целевую переменную obj.
σ>Или не создаётся и не копируется
А ты проверял?
class SomeObj {
public:
SomeObj(int) {}
//SomeObj(const SomeObj &) = delete;
};
//const SomeObj obj = SomeObj(42);
const SomeObj obj2(42);Поиграй с раскомментированием строчек в различных сочетаниях.
σ>тоже «согласно семантике», а не «способу реализации»
Семантика описана простейшим исходником, который я ХЗ как можно было не суметь прочитать.
Если же ты опять пытаешься озвучить свою "эрудицию", то ты ошибся стадией рассуждения об исходнике — оптимизация выполняется над изначальной неоптимизированной моделью кода, и в этой модели кода должен быть доступен конструктор копирования, которого после оптимизации не будет. Но он всё-равно нужен просто в декларации.
Ну и, в дебаге обычно полное повторение описанного в коде безо-всякий оптимизаций.
V>>Лишнего копирования/перемещения можно избежать.
V>>При возврате по значению применяется ровно та же логика.
σ>Только при возврате по значению может быть несколько переменных с разной константностью
И какая разница, если оперируем данными по значению?
Семантически в этом случае создаются копии объектов.
А упоминание об обязательности RVO — это ж для дурачка-программиста, а не для компилятора, потому что с С++17 RVO будет использовано в любом случае, даже если конструкторы/деструкторы имеют побочные эффекты.
Выделенное — это для тебя, программиста, чтобы ты потом не задавал вопросов "а почему так?".
(Впрочем, в это уже тыкал, пошли по кругу)
σ>И тогда возникают некоторые вопросы.
Странные у тебя какие-то вопросы, которые ты не в состоянии даже просто сформулировать на 20-й итерации.
σ>Но даже если бы было и только — какая разница?
Никакой, бо оптимизация не изменяет семантику.
А даже если случилось RVO, то мы имеем дело с одной областью памяти, но с разными ссылками на неё в разные моменты работы программы, но никогда одновременно.
(Опять по кругу в тебя этим тыкают)
ХЗ, кароч...
Если сложно с пониманием передачи данных по значению, попробуй порассуждать про передачу через ссылочную семантику:
SomeObj * const obj = new SomeObj(42);Тут оператор new создаёт в куче неконстантный объект и возвращает неконстантный указатель на этот объект, где значение неконстантного указателя копируется в константный указатель obj.
Надеюсь, хотя бы с примитивными типами данных сложности понимания не возникают — каким образом мы копируем числовое значение неконстантного указателя в константный? ))
А если обернуть числовое значение в некий класс SomeObj, ы?
Неужели понимать становится сложнее? ))