|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
||||||
Головоломка для тех, кому под Новый Год нечего делать28.12.2023, 09:07. Показов 5540. Ответов 34
Метки нет (Все метки)
Тема на самом деле уже не раз упоминалась, но тем не менее... Пример кода
p).Головоломка: кто прав согласно спецификации языка?
0
|
||||||
| 28.12.2023, 09:07 | |
|
Ответы с готовыми решениями:
34
Кому скучно и нечего делать, у меня есть нерабочий код Если кому-то нечего делать по выходным в ближайшие полтора года Крестики-нолики. Кому делать нечего научите как исправить ошибку |
|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
||||
| 29.12.2023, 22:24 [ТС] | ||||
|
При чем здесь значения полей? Значения полей живут своей жизнью, никак не связанной с самими полями. Почему это мы "не имеем права" их возвращать? Если вы хотели сказать, что деструкция объекта-параметра может инвалидировать и значение поля... то я по-прежнему не понимаю, что вы хотите сказать. Деструкция объекта-параметра была и есть всегда. Мой ответ на самом деле лишь продлевает время жизни объекта-параметра. Как из этого можно было сделать вывод, что продление времени жизни приводит к "не имеем права возвращать"??? В упор не понимаю. А вот это утверждение из #14 p проводилось некое прямое копирование данных именно и непосредственно из поля s.r. Функция foo возвращает prvalue. Никакой привязки именно к полю s.r у возвращаемого prvalue нет. Нас интересует только значение этого поля. Но язык не обязан брать его из этого поля в некий "последний момент, непосредственно перед присваиванием в p".
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 29.12.2023, 23:21 | ||
|
0
|
||
|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
||
| 29.12.2023, 23:50 [ТС] | ||
foo является prvalue. Ни от каких продлений и ни от каких lifetime оно ни в коем случае не зависит. Зависимость от lifetime появилась бы, если бы foo возвращала void *&. Но она возвращает void *. Это всегда абсолютно безопасно.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 30.12.2023, 07:15 | ||
|
Когда мы пишем p = foo(p);, хотелось бы иметь возможность полагаться на конкретное значение p подобно тому, как мы уверены что int result = sum(2, 2); будет равно 4, а не 200 или 4 в зависимости от компилятора.
0
|
||
|
38 / 27 / 13
Регистрация: 18.12.2023
Сообщений: 74
|
|
| 30.12.2023, 09:40 | |
|
Решил почитать ISO/IEC 14882 2020 Года, если я правильно понял, то поведение GCC и Clang соответствует стандарту C++, где указатель p должен быть сброшен в nullptr после завершения вызова foo, но до присваивания результата функции переменной p.
Ссылаюсь на пункты class.temporary про описание жизненых циклов временных переменных basic.life - общее описание жизненного цикла объектов, от начала жизни до вызова его деструктора class.copy.elision - о создании или уничтожении объектов при передаче значений функции и возврате из них N4860.pdf
0
|
|
|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
|||||||||||||
| 30.12.2023, 22:45 [ТС] | |||||||||||||
|
Поведение GCC/Clang нарушает этот стандарт. Однако это поведение (являющееся во многих отношениях более логичным и практичным) было, наконец, канонизировано в С++17. Именно по этой причине в данном вопросе все компиляторы правы (начиная с С++17). Обратите внимание, что стандарт четко квантифицирует два варианта допустимого поведения: либо параметры удаляются сразу повел завершения вызова функции, либо живут до завершения полного выражения. Удалять параметры "где по посередине" между этими моментами не разрешается. --- Интересно, кстати, заметить, что это означает, что в компиляторах, придерживающихся Itanium ABI, то есть откладывающих момент деструкции параметров, из функции можно (!) возвращать ссылки/указатели на их параметры, помня при этом, что эти ссылки/указатели далее в вызывающем коде можно использовать не позднее конца полного выражения. Разумеется, ничего хорошего в такой практике нет по целому ряду причин, но компиляторы, выбравшие такой implementation-defined вариант, обязаны гарантировать работоспособность такого кода. При этом GCC, какое-то время назад начавший крестовый поход против возвращения ссылок/указателей на локальные переменные (и взамен подставляющий нулевые ссылки/указатели!), умудряется выдать предупреждение на такое возвращение и также возвращает взамен нулевую ссылку/указатель. То есть компилятор GCC до легализации поздней деструкции параметров нарушал стандарт языка, а сейчас, добившись легализации поздней деструкции, по-прежнему реализует ее некорректно , т.е. опять нарушает стандарт языка, но по-другому ¯\_(ツ)_/¯ Например, вот такой код является совершенно корректным (и обладает полностью определенным поведением) в компиляторах, придерживающихся поздней деструкции параметров
Подавить и предупреждение, и возвращение нулевой ссылки, однако, несложно
0
|
|||||||||||||
|
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,236
|
||
| 30.12.2023, 22:47 | ||
|
0
|
||
|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
||
| 30.12.2023, 22:55 [ТС] | ||
|
Я еще могу понять необходимость такого уточнения сейчас при обсуждении чего-то специфичного для С++23. Но для С++17... !!!
0
|
||
| 30.12.2023, 23:01 [ТС] | |
|
0
|
|
|
Комп_Оратор)
|
|||||||||||||||||||||
| 04.01.2024, 12:20 | |||||||||||||||||||||
|
Я пишу в этой теме без особой радости ввиду того, что моё отношение к ТС достаточно негативно. Не вдаваясь в подробности, я должен сказать, что причиной является выступление ТС в негативном комментарии к моему посту Объясните пожалуйста что делает конструкция *& в нашей функции и предоставленная ссылка сюда. Теперь о текущей теме. Моё мнение близко ко мнению Undisputed. Аргументы следующие. Вот функция:
0
|
|||||||||||||||||||||
|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
||
| 04.01.2024, 21:13 [ТС] | ||
|
В качестве резюме лишь компактно реитерирую уже сказанное выше: целью этой темы являются иллюстрация того малопонятного новичкам факта, что параметры функции НЕ являются локальными объектами этой функции. Параметры функции принадлежат вызывающему коду. А также иллюстрация того факта, что если ранее эти свойства параметров существенной роли не играли (кроме, разве что, вопросов обработки исключений), то начиная с С++17 они начинают иметь существенно более заметные и далеко идущие последствия. Приведенный искусственный пример как раз и иллюстрирует один из вариантов таких последствий. Пока у вас не возникнет понимания этого вопроса, то есть пока вы будете упёрто расценивать параметры функций как ее "локальные объекты", вам рано или поздно придется столкнуться с неожиданными ситуациями, не вписывающимися в круг ваших заблуждений. И тут вам придется либо заставить себя разобраться в теме, либо... "без особой радости" продолжать выдумывать "свои мнения" и притягивать за уши теории о "некорректности работы компиляторов" в отчаянных попытках натянуть сову своих домыслов на глобус реальности.
0
|
||
|
Комп_Оратор)
|
||
| 04.01.2024, 22:17 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 05.01.2024, 14:48 | ||||||
|
IGPIGP,
На самом деле возврат поля это лишь частный случай проблемы. Приведу пример утечки памяти, которую на уровне языка не получится отследить. Представим что функция foo выглядит вот так
p = foo(p);, то язык нам не говорит, будет ли в итоге утечка памяти или нет. Если разрушение объекта s будет перед присваиванием, то мы получим адрес и сможем освободить соответствующий участок памяти. Если же объект s будет разрушен после присваивания, то мы получим утечку без возможности освободить выделенную память. Более того, если функция что-то считает и записывает результат в динамически выделенную память, то все эти расчеты благополочно вылетят в трубу.Добавлено через 3 минуты Основная претензия здесь в том, что это implementation defined, что на мой взгляд некорректно. Думаю, здесь должна быть конкретика, а желающие какую нибудь экзотику компилятописатели, могут сделать фичу в своем компиляторе и включать ее через флаг
0
|
||||||
|
Вездепух
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
|
|||
| 05.01.2024, 19:23 [ТС] | |||
|
0
|
|||
| 05.01.2024, 19:23 | |
|
Ищу консультанта/учителя С под Linux, Для тех,кому интересно делиться знаниями Написал программу от делать нечего, она оказалась полезной. А дальше что с ней делать?
Для тех, кому непонятна рекурсия Тест-игра (для тех, кому за 18) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|