Тема: malloc -> new
Показать сообщение отдельно
  #4  
Старый 06.02.2023, 23:43
Nil A
Guest
 
Сообщений: n/a
По умолчанию Как бы так голдед зарефакторить?

Nil A написал(а) к Vitaliy Aksyonov в Feb 23 22:07:32 по местному времени:

* Originally in ru.golded
* Crossposted in su.c_cpp
Нello, Vitaliy!

Sunday February 05 2023 19:44, from Vitaliy Aksyonov -> All:

VA> Есть желание заняться выпиливанием malloc/free и заменой на new,

Заодно и все memset() и memcpy() выпилить, а наче овчинка выделки не стоит.

Заодно и все рукописные динамические массивы, линкед-листы, и все те дата-стракчерсы, что надо самому писать на plain C, то в C++ можно немного контейнеры готовые применить, уже ~ 20% всего кода просто выпилиться.

Заодно все char* на какие-нибудь std::string, но лучше на ICU, или ложить в string только UTF.

VA> чтобы побочные эффекты конструкторов не терялись.

В эпоху Си-с-классами, когда не было таких слов, как RVO, не говоря уже об "современном" C++11 с rvalue и мув-семантикой, то вот писали как просто структуры, которые можно memset и memcpy, и пофиг что там вообще виртуальная функции есть, т.е. vtable, и что такие типы ниразу не POD, чтобы их побитово туда-сюда.

Но это уже большой рефакторинг получается.

А главное, ну окей, проверишь ты ручками на Jam/Squish/Opus базах, а там в голдеде только разных баз и форматов с десяток, где ты такие референсные найдёшь, или ты зачекинешь, а вы, братцы, сами там проверяйте, если что поломается, то может починю, а может и забью, так как мишен мой закончился на этом.

VA> Плюс убрать странные конструкции в виде:
VA> recptr = new char [recsize];
VA> throw_new(recptr);

В эпоху Си-с-классами.. говорил вроде уже, не было стандарта на то, что new возвращает (void*)0 или кидает исключение. Собственно, исключения только потом придумали. А потом ещё и темплейты придумали. Сегодня это смешно, но так было.

Сегодня new будет кидать исключение, и надо его ещё заставить возвращать nullptr путём new(std::nothrow) https://en.cppreference.com/w/cpp/memory/new/nothrow

А кто более прошаренный, так и вовсе скажет, что на x86_64 у тебя new всегда вернётся без ошибки, просто памяти виртуально дехера, но потом ты словишь плохой автобус (SIGBUS).

А кто ещё ещё более прошаренный, тот скажет, ну кагбэ что вообще можно сделать, когда кончается память, данихера полезного не сделаешь, позакрывать все файлы, и в аборт. Кстати, ещё вопрос, тебя снесёт SIGBUS, или таки oom killer ;-) А нет, мы же проверяем возврат malloc() и new, и делаем что-то разумное при этом.

VA> Это ведь имеет смысл только в случае, если код собирается без
VA> поддержки исключений.

Ну я вот щас собиру без поддержки исключений. Есть два варианта, компилятор тупо вставит std::terminate() в том месте. Второй вариант, современный компилятор, увидит -fno-exceptions и throw в коде и откажется компилировать.

VA> Кто-то знает, есть ли такие сборки или это тоже
VA> лучше выкосить?

Думаю gcc 4.8 примерно должен собирать, и ещё из реальных мамонтов - Open Watcom 2.0.

Best Regards, Nil
--- GoldED+/LNX 1.1.5
Ответить с цитированием