LINUX.ORG.RU

defer в C быть!

 ,


0

9

Привет, ЛОР!

Как я писал три года назад, в стандарт языка Си было предложено добавить выражение defer, выполняющее функцию или блок кода по выходу из области видимости, где оно было объявлено.

На днях данное предложение получило официальный статус и, скорее всего, defer появится в будущем стандарте C2y.

При этом, defer почти наверняка не будет добавлен в C++, так как его использование будет конфликтовать с другими частями этого языка.

Ссылка на пост в блоге автора: https://thephd.dev/c2y-the-defer-technical-specification-its-time-go-go-go

Спецификация: https://thephd.dev/_vendor/future_cxx/technical%20specification/C%20-%20defer/C%20-%20defer%20Technical%20Specification.pdf

Ответ на: комментарий от no-such-file

Ясен пень, плохому проще научиться.

Не суть. Суть в том, что в сишке это все выглядит проклято.

gaylord
()
Ответ на: комментарий от iron

А напишите плиз кто-нить в каких кейсах дефер может быть полезен.

Очередные неочевидные грабли. Пример сочетания с goto уже приводили.

Psilocybe ★★★★★
()
Ответ на: комментарий от Psilocybe

Очередные неочевидные грабли. Пример сочетания с goto уже приводили.

Ещё один по ссылке пройти не осилил. Сочетание defer и goto будет ошибкой сборки.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от zurg

чему такому плохому научивает раст, тем более на фоне плюсцов?

Писать понятный код, что вредит job security, наверное.

anonymous
()
Ответ на: комментарий от zurg

в си нет ссылок, они не знают что это такое, им надо говорить «пройди по указателю»

Не пойдут всё равно, вдруг null.

anonymous
()
Ответ на: комментарий от anonymous

Вообще, никто не мешает авторам того же Clang попытаться сделать вообще все найденные случаи UB ошибками сборки. Это будет вполне в рамках станданта. Но тогда сишники не будут страдать, а это не скрепно.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от gaylord

Я учил людей крестам и Rust, и в случае второго это куда более простой процесс.

Это необъективная метрика. Может ты учил хреново.

anonymous
()
Ответ на: комментарий от anonymous

Это необъективная метрика. Может ты учил хреново.

Это форум, а не научный журнал.

gaylord
()
Ответ на: комментарий от wandrien

А есть этому пруфы? Самые часто стреляющие случаи UB типа удаления проверок на NULL и подобного, судя по всему, к оптимизации отношения не имеют.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel
int inc(int x) {
  return x+1; // оптимизация UB, если INT_MAX
}
anonymous
()
Ответ на: комментарий от hateyoufeel

Удаление лишнего кода к оптимизации отношения не имеет? Ну здрасти, это она и есть буквально.

Алсо, UB в знаковой арифметике позволяет компилятору рассчитывать на утверждения типа «если b >= 0, то a + b >= a» и таким образом сильнее переколбашивать вычисления.

Не помню, в каком там из языков (zig? не помню точно, врать не буду) авторы на голубом глазу утверждали, что «мы специально добавить UB уже в беззнаковую арифметику, чтобы сильнее оптимизировать котт». (Как по мне, поехавшие.)

wandrien ★★★
()
Ответ на: комментарий от wandrien

да лана. основная оптимизация (по эффекту) это рассовывание переменных по регистрам, вынос общих подвыражений, инлайн коротких функций…а уб - это экзотика.

alysnix ★★★
()
Ответ на: комментарий от hateyoufeel

Плюсы испортили STL ещё на самом зарождении и добили в 11м стандарте. Впрочем, это не мешает писать без единого STL инклуда с отключенным rtti/исключениями/threadsafe статиками и не линковаться к c++ рантайму вообще, при этом пользуясь полиморфизмом и метапрограммированием, которое даёт сам язык.

mittorn ★★★★★
()
Ответ на: комментарий от wandrien

Удаление лишнего кода к оптимизации отношения не имеет? Ну здрасти, это она и есть буквально.

В таких случаях она на скорость не влияет практически.

Алсо, UB в знаковой арифметике позволяет компилятору рассчитывать на утверждения типа «если b >= 0, то a + b >= a» и таким образом сильнее переколбашивать вычисления.

Есть пруфы того, что это реально увеличивает производительность где-то кроме синтетических тестов?

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от thunar

Сделай тоже самое с unique_ptr с кастомным деструктором, и посмотрим, насколько удобнее.

rupert ★★★★★
()
Ответ на: комментарий от mittorn

Плюсы испортили STL ещё на самом зарождении и добили в 11м стандарте.

Да нет, до C++11 плюсы были просто невразумительным говноязычком. После этого на них стало куда удобнее писать код.

Впрочем, это не мешает писать без единого STL инклуда с отключенным rtti/исключениями/threadsafe статиками и не линковаться к c++ рантайму вообще, при этом пользуясь полиморфизмом и метапрограммированием, которое даёт сам язык.

Конечно не мешает. Только говно выходит в большинстве случаев.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Есть пруфы того, что это реально увеличивает производительность где-то кроме синтетических тестов?

Знаковая арифметика без UB - это gmplib, и то условно. Сравнивай.

anonymous
()

Ещё можно понять почему олды на C сидят. Но где возьмут мотивацию изучать весь этот костылинг неофиты?

ahdenchik
()
Ответ на: комментарий от anonymous

Для справки:

Scope guard есть в D (урезанная версия под названием betterC)

При этом там реализовано RAII и время жизни объектов хорошо контролируется

ahdenchik
()
Ответ на: комментарий от anonymous

Есть пруфы того, что это реально увеличивает производительность где-то кроме синтетических тестов?

Знаковая арифметика без UB - это gmplib, и то условно. Сравнивай.

Знаковая арифметика без UB включается в gcc/clang ключиком -fwrapv, и он включен у большой части впопенсорцного софта, включая ядро.

 -fwrapv
           This option instructs the compiler to assume that signed arithmetic overflow of addition, subtraction and multiplication wraps around using twos-complement representation.  This flag enables some optimizations and disables others.

Вопрос в том, почему не сделать это документированным дефолтом в стандарте. Потому что кроме twos-complement арифметики сейчас нигде и нет, другие платформы давно сдохли и Си на них не работает.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

Ещё один по ссылке пройти не осилил. Сочетание defer и goto будет ошибкой сборки.

Ещё один прошёл по ссылке, прочитал, ничего не понял. :)

goto нельзя внутрь defer{…} и изнутри defer{…}, что, в общем-то, логично.

Во всех остальных случаях не только можно, но и нужно. defer с которым нельзя использовать goto вообще нахрен не нужен, ибо в нём нет никакого смысла. Именно для goto и прочих return с continue он может быть полезен.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Ещё один прошёл по ссылке, прочитал, ничего не понял. :)

Соболезную.

Во всех остальных случаях не только можно, но и нужно. defer с которым нельзя использовать goto вообще нахрен не нужен, ибо в нём нет никакого смысла. Именно для goto и прочих return с continue он может быть полезен.

Там суть в том, что goto не может перепрыгивать через defer. Правила те же, что и для объявления переменных.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Там суть в том, что goto не может перепрыгивать через defer.

Может, если defer внутри блока через который перепрыгивает goto.

Правила те же, что и для объявления переменных.

Ну так defer в общем-то и нужен только для деинициализации этих переменных. Ну там free сделать или сокет закрыть. То, что обычно через какие-нибудь goto out_close делается.

Stanson ★★★★★
()
Ответ на: комментарий от anonymous

другие платформы давно сдохли и Си на них не работает.

Unix-мейнфреймы в госбанках?

Во-первых, там тоже twos-complement. Всякие UNIVAC и CDC давно на помойках или в музеях, это всё срань из 60х и от неё уже лет 40 как избавились.

Во-вторых, даже если это говно чисто случайно где-то до сих пор работает, современными компиляторами туда никто никогда ничего собирать не будет, и при разработке стандарта языка в 2025 году это всё учитывать не нужно.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

С деньгами обычно работают в десятичном представлении. Там даже не прямой/обратный код, не говоря уже о дополнительном.

anonymous
()
Ответ на: комментарий от anonymous

С деньгами обычно работают в десятичном представлении.

Если ты про BCD, то этого давно не используется вообще нигде.

Там даже не прямой/обратный код, не говоря уже о дополнительном.

Тебя обманули, анон. Все давно используют обычные целочисленные типы, всё норм.

В любом случае, к Си это отношения даже близко не имеет, поскольку Си никогда не поддерживал BCD.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Все давно используют обычные целочисленные типы

Но не обязательно в дополнительном коде.

Си - это не ассемблер конкретной архитектуры, который тебе нравится.

Лучше иди пинай хаскель, чтобы не использовал тормозную безразмерную арифметику по умолчанию.

anonymous
()
Ответ на: комментарий от anonymous

Но не обязательно в дополнительном коде.

Это всё не имеет отношения к Си.

Лучше иди пинай хаскель, чтобы не использовал тормозную безразмерную арифметику по умолчанию.

Про безразмерную тормозную арифметику ты откуда-то притащил (ну либо другой анон). Я про неё ничего не писал тут. -fwrapv к безразмерной арифметике отношения не имеет даже близко.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Это всё не имеет отношения к Си.

Обязательность дополнительного кода не имеет отношения к Си.

ты откуда-то притащил

А ты откуда притащил дополнительный код?

anonymous
()
Ответ на: комментарий от anonymous

Обязательность дополнительного кода не имеет отношения к Си.

Она имеет отношение к тому, что все современные платформы его используют. Примерно как на всех современных платформах байт равен 8 битам (это в Си уже учтено).

А ты откуда притащил дополнительный код?

Из мануала к gcc. В мануале к clang такое же написано.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от Obezyan

Ну в их бумажке goto внутрь defer{…} является constraint violation. Если это сделают error а не warning то оно просто не соберётся.

Так-то понятно, что goto можно откуда угодно и куда угодно.

Stanson ★★★★★
()
Ответ на: комментарий от hateyoufeel

Из мануала к gcc

GCC - это Си? Clang? А компилятор для AIX для какого-нибудь мейнфрейма as/400 - это Си? А компилятор для какого-нибудь микроконтроллера avr без дополнительного кода?

anonymous
()
Ответ на: комментарий от anonymous

GCC - это Си? Clang?

Да. На данный момент, есть пример всего три компилятора, поддерживающих современные стандарты: GCC, Clang и MSVC*. Последний со звёздочкой, потому что MS их поддержку добавляют с очень большой задержкой и там свои приколы.

А компилятор для AIX для какого-нибудь мейнфрейма as/400

Discontinued Sep 30, 2013

Оно сдохло, новых стандартов Си там никогда не будет.

А компилятор для какого-нибудь микроконтроллера avr без дополнительного кода?

AVR реализует two’s complement арифметику. С другой стороны, туда тоже никто свежие сишные стандарты не суёт, так что см выше про AS/400.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от anonymous

RAII переоценён.

Для внешних ресурсов – это риск удерживать их дольше, чем нужно, потому что операция неявная. Типичная ситуация – говнокод с lock_guard, а далее идёт sleep (нужно разлочить до него без RAII).

Для памяти тоже часто говно, потому что перформанс критикал код (а другой на плюсах не нужно пистаь) будет использовать arena/pool аллокацию, которая тоже не натягивается на концепцию RAII.

snizovtsev ★★★★★
()
Ответ на: комментарий от hateyoufeel

Потому что кроме twos-complement арифметики сейчас нигде и нет, другие платформы давно сдохли и Си на них не работает.

Там вроде в свежем стандарте Сишку таки прибили к twos-complement арифметике наконец? Или у меня ложные воспоминания? Лень лезть в документ.

Вопрос в том, почему не сделать это документированным дефолтом в стандарте.

Потому что у старых пердунов тогда жопа отвалится. Они вон в realloc новый UB завезли просто потому что. Смысл существования Си в текущем виде - страдания.

wandrien ★★★
()
Ответ на: комментарий от zurg

Главное - чтобы не услышать «пройдёмте в отделение». А всё остальное можно пережить.

seiken ★★★★★
()
Ответ на: комментарий от mittorn

говно уже вышло в виде boost/stl

Деды-пердеды, фанатеющие по «Си-с-классами» в треде! Все в машину!

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от mittorn

Тут даже клоун уже не уместен, только фейспалм и звонок в дурку…

Говнокодир из 90х негодует!

hateyoufeel ★★★★★
() автор топика
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)