= Сообщение: 2493 из 3553 ======================================== RU.GOLDED = От : Nil A 2:5015/46 06 Feb 23 22:07:32 Кому : Vitaliy Aksyonov 06 Feb 23 22:07:32 Тема : Как бы так голдед зарефакторить? FGHI : area://RU.GOLDED?msgid=2:5015/46+63e15527 На : area://RU.GOLDED?msgid=1:104/117+63e06c5b = Кодировка сообщения определена как: CP866 ================================== Ответ: area://RU.GOLDED?msgid=1:104/117+63e17591 ============================================================================== * Originally in ru.golded * Crossposted in su.c_cpp Hello, 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 * Origin: Linux 2.6.32-042stab145.3 (2:5015/46) |