Финализируют работу программы автоматически вызванные деструкторы. И std::terminate. В случае крайней небходимости std::terminate_handler. Ни в коем случае эта логика не должна стоять над каждым выделением памяти, особенно учитывая что оно ДОЛЖНО быть неявным в современном С++(то есть без явного new)
Необходимость рефлексии очень преувеличена. Рантайм рефлексия - безусловное зло, не привносит никаких дополнительных возможностей, зато усложняет понимание кода многократно, сильно снижает производительность и увеличивает сложность реализации компиляторов.
Статическая рефлексия в том виде, что её предлагают тоже избыточна, пример с узнаваниями названий из enum, такая библиотека уже есть и написана она на обычном С++ без всякой рефлексии, называется magic enum. Насчёт сериализации - таки тоже уже есть, вот пример библиотеки для бинарной сериализации, где описанием формата является тип из С++ единственное что нужно написать программисту чтобы его тип стал поддерживаться - using enable_magic = std::true_type; Плюс всяческие алгоритмы работы с таким типом как с туплом и общие алгоритмы типа tuple cat / construct from tuple и прочие https://github.com/kelbon/UndefinedBehavior_GoldEdition/blob/master/include/kelbon_serialization.ixx
Вы слышали про std::sort который принимает любой компаратор? Про то что можно создавать ссылки на поля, типа template<typename C, typename T> auto Foo(T C::* value) { return 10; }
обработка битов медленнее обработки байтов. Так что нет, это не быстрее. А платят разработчикам серверных и прочих приложений за качественный код, который потом можно редактировать, а не копаться в битах и разбираться почему после изменения sizeof структурки всё упало
Что-то как-то не сходится, вы считаете байты при копировании memcpy, но при этом не считаете оверхед на выделение памяти + обращение по поинтеру + проблемы с кешом проца в вопросе операций с числами, странновато не правда ли?
int x = 5;
int y = std::move(x);
std::cout << x;
Это должно быть валидной операцией в том числе при подмене int на ваши "числа", но это сломает код по факту. Итог - ваши числа не ведут себя как числа.
Боюсь проблема тут в самом существовании такого взаимодействия языков и исправлять это нужно просто написанием отдельных модулей на конкретных языках без всяческих связей через кривотню
Что будет если realloc вернёт ошибку? И ведь его ошибка не такая, что случится только если вся память завалена как у обычного выделения памяти.
Где поддержка аллокаторов тогда?(это не аллокатор)
Потеря производительности при обращении по указателю каждый раз?
Выигрыш производительности только в случае если move, но все кто мувает число считает, что в старом значении валидное опять же число.
А вы экономите на memcpy 2-10 байт теряя на обращении через поинтер каждый раз и ломаете семантику поведения, ваши числа ведут себя не также как обычные инты
Кстати, realloc в С++ это вообще по умолчанию УБ, т.к. на компиляции неизвестно что делать с лайфтаймами объектов
По описанию "проблем" с другими библиотеками и описанию достоинств своей выглядит, что вы не совсем разбираетесь в плюсах, например почему компиляция из исходников это проблема? Почему поддержка gcc и msvc это кросплатформенность?
Header-only (по умолчанию, с возможностью включить опцию компиляции).
Что это вообще значит? Опция чтобы компилировалось? Что насчет поддержки С++20? Почему так явно перечислены 11 14 17?
Я бы объяснил так, при индексе >= 4 - уб. Тогда i всегда < 4, тогда цикл бесконечный. В этом бесконечном цикле только один выход - return true, значит он когда то и случиться, можно оптимизировать до return true
Правильные выводы, просто расценивать нужно политику не как "дурачки ниче не понимают тут дурь сказали там дурь сказали, плохой закон приняли", а как реальную последовательную политику государства, они очень чётко понимают что делают и зачем. По сути вся экономика монополизирована, а дальше происходит некий картельный сговор с участием государства который нацелен просто против людей и их зарплат
Вообще C++ тащит много хлама (генераторы числовых распределений?) в рантайм
Это вообще о чём? Про какой мир общаемся?
std::unordered_map в котором нельзя проверить строковый ключ, не создав строку
наверное нужно было посмотреть какие шаблонные параметры есть у этого класса и окажется, что возможность добавить такое вдруг появится. К тому же в новых стандартах ещё добавляют фич связанных с этим
Но при этом нет строкового пула "из коробки"
Опять не пойми из какого мира вообще это, что за стринг пулы? Откуда в списке вью, строка, указатель появились lvalue const lvalue и т.д.?
Есть std::function и std::bind, но нет функции, создающей std::function из указателя на нестатическую функцию класса
Опять же, в моём С++ почему то это есть и работает ровно как от них ожидаешь
Что за бред? Undefined behavior это как раз то, ЧТО ЯВНО прописано в стандарте как неопределённое поведение
Хватит критиковать вымышленный вами же псевдоС++
Ни на что не намекаю, цитата из статьи:
clang++ -target arm-linux-gnueabihf main.cpp
Финализируют работу программы автоматически вызванные деструкторы. И std::terminate. В случае крайней небходимости std::terminate_handler. Ни в коем случае эта логика не должна стоять над каждым выделением памяти, особенно учитывая что оно ДОЛЖНО быть неявным в современном С++(то есть без явного new)
В итоге для 99% программ достаточно
int main() try {
...
} catch (std::bad_alloc&){
}
и что это за магические слова? Что они должны означать? Зачем это?
Необходимость рефлексии очень преувеличена. Рантайм рефлексия - безусловное зло, не привносит никаких дополнительных возможностей, зато усложняет понимание кода многократно, сильно снижает производительность и увеличивает сложность реализации компиляторов.
Статическая рефлексия в том виде, что её предлагают тоже избыточна, пример с узнаваниями названий из enum, такая библиотека уже есть и написана она на обычном С++ без всякой рефлексии, называется magic enum.
Насчёт сериализации - таки тоже уже есть, вот пример библиотеки для бинарной сериализации, где описанием формата является тип из С++ единственное что нужно написать программисту чтобы его тип стал поддерживаться - using enable_magic = std::true_type;
Плюс всяческие алгоритмы работы с таким типом как с туплом и общие алгоритмы типа tuple cat / construct from tuple и прочие
https://github.com/kelbon/UndefinedBehavior_GoldEdition/blob/master/include/kelbon_serialization.ixx
Может вы хотя бы годболтом научитесь пользоваться? Или вы на глаз компилируете?
То ли дело макросы, там нет источников ошибок и всё просто, а главное производительно, современно и понятно
Заглянул в реализацию - шаблоны разеделены на хедеры и cpp, всё, это уже автоматически ifndr, не используются универсальные ссылки вообще
Вы слышали про std::sort который принимает любой компаратор? Про то что можно создавать ссылки на поля, типа
template<typename C, typename T>
auto Foo(T C::* value) {
return 10;
}
Зачем всё сделано на макросах?
ты реально не понимаешь что тебе всё равно придётся проверить ошибка там или нет?
обработка битов медленнее обработки байтов. Так что нет, это не быстрее. А платят разработчикам серверных и прочих приложений за качественный код, который потом можно редактировать, а не копаться в битах и разбираться почему после изменения sizeof структурки всё упало
Экономить на спичках и желание чтобы оператор ++ НЕ ВЫДЕЛЯЛ ПАМЯТЬ это несколько разные вещи
Если сделать там 0, то всё ещё будет вести себя не как обычное число
не хочу вас разочаровывать, но там ещё operator++ память выделяет. Как и неявное преобразование инта к этому длинному инту
Мув конструктор не является noexcept что заставит вектор и другие стандарнтые контейтнеры ооочень много оверхедить
Что-то как-то не сходится, вы считаете байты при копировании memcpy, но при этом не считаете оверхед на выделение памяти + обращение по поинтеру + проблемы с кешом проца в вопросе операций с числами, странновато не правда ли?
int x = 5;
int y = std::move(x);
std::cout << x;
Это должно быть валидной операцией в том числе при подмене int на ваши "числа", но это сломает код по факту. Итог - ваши числа не ведут себя как числа.
Боюсь проблема тут в самом существовании такого взаимодействия языков и исправлять это нужно просто написанием отдельных модулей на конкретных языках без всяческих связей через кривотню
Что будет если realloc вернёт ошибку? И ведь его ошибка не такая, что случится только если вся память завалена как у обычного выделения памяти.
Где поддержка аллокаторов тогда?(это не аллокатор)
Потеря производительности при обращении по указателю каждый раз?
Выигрыш производительности только в случае если move, но все кто мувает число считает, что в старом значении валидное опять же число.
А вы экономите на memcpy 2-10 байт теряя на обращении через поинтер каждый раз и ломаете семантику поведения, ваши числа ведут себя не также как обычные инты
Кстати, realloc в С++ это вообще по умолчанию УБ, т.к. на компиляции неизвестно что делать с лайфтаймами объектов
Простите что я тут вижу вообще? Это С?
По описанию "проблем" с другими библиотеками и описанию достоинств своей выглядит, что вы не совсем разбираетесь в плюсах, например почему компиляция из исходников это проблема? Почему поддержка gcc и msvc это кросплатформенность?
Header-only (по умолчанию, с возможностью включить опцию компиляции).
Что это вообще значит? Опция чтобы компилировалось? Что насчет поддержки С++20? Почему так явно перечислены 11 14 17?
Я бы объяснил так, при индексе >= 4 - уб. Тогда i всегда < 4, тогда цикл бесконечный. В этом бесконечном цикле только один выход - return true, значит он когда то и случиться, можно оптимизировать до return true
Правильные выводы, просто расценивать нужно политику не как "дурачки ниче не понимают тут дурь сказали там дурь сказали, плохой закон приняли", а как реальную последовательную политику государства, они очень чётко понимают что делают и зачем. По сути вся экономика монополизирована, а дальше происходит некий картельный сговор с участием государства который нацелен просто против людей и их зарплат
Обсессивно-компульсивное расстройство это проблема, не нужно навязывать его всем во всех языках программирования
если ты входишь в 0% тех, кому это нужно на релизе, то ты используешь метод at() и проверяешь всегда
Это вообще о чём? Про какой мир общаемся?
наверное нужно было посмотреть какие шаблонные параметры есть у этого класса и окажется, что возможность добавить такое вдруг появится. К тому же в новых стандартах ещё добавляют фич связанных с этим
Опять не пойми из какого мира вообще это, что за стринг пулы? Откуда в списке вью, строка, указатель появились lvalue const lvalue и т.д.?
Опять же, в моём С++ почему то это есть и работает ровно как от них ожидаешь
https://godbolt.org/z/s88s681M6