Информация об изменениях

Сообщение Re[94]: Когда это наконец станет defined behavior? от 21.08.2023 17:21

Изменено 21.08.2023 17:23 vdimas

Re[94]: Когда это наконец станет defined behavior?
Здравствуйте, σ, Вы писали:

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>>
σ>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, ы?
Неужели понимать становится сложнее? ))