Aroch
Что то я не понял, какие семантические проверки для массива байтов?
А проверка файла - там только одна - то что он прочитался в буфер.
А вообще ситуации бывают самые разные. Чего уж говорить, я и сам так где то делаю порой.
Но конкретная тема - она про оптимизацию больших билдов, если кто позабыл.
Поэтому, истории типа "я писал программу для дверного звонка, там нет динамической аллокации и вообще файлов" - они мимо.
Der FlugSimulator
> Что то я не понял, какие семантические проверки для массива байтов?
std::array<char, 8> arr = {'1', '2', 3, 4, 5, '6', '7', '8', some_string};
Компилятор тебя с таким кодом завернет сразу. А тебе придется отдельно проверять что в файле всё корректно.
Aroch
Какая то специально надуманная и несуществующая IRL ситуация.
Дело даже не в том, что из за строки в 8 символов никто и париться не будет, а в том что:
- или у тебя какая то осмысленная структура, которой надо специально манипулировать (а значит будyт и десериализации и валидации)
- или какой то неопределнный std::byte blob[] = {...} типа видео с котом.
Я говорил строго про второе - пихать такое в исходник было бы странно. А валидации - они вообще перпендикулярны данной теме.
Der FlugSimulator
> А С++ 40
Да даже в компиляторе ассемблера под z80 есть импорт экспорт модулей без инклудов, а слоупоки из c++ только в 20м их изобрели
entryway
> Поэтому все ждут std::embed
Есть incbin, он сейвит с выравниваниями simd, а ещё можно загрузить бинарь в экзешник как windows .rc. Можно ещё бинарь скомпилить как .o файл отдельной утилитой и линкером объединить. В коде писать extern const uint8_t* my_data.
Чтоб std::embed существовал, надо лимит на размер массива убрать
Der FlugSimulator
> Нет, не надо. Это же твой файл.
То, что он мой, никак не уменьшает вероятность, скажем, при переносе проекта этот файл потерять, забыть обновить на новую версию, побить при копировании и т. п. Если не сделать сообщения об ошибках, очень легко, спустя пару месяцев, убить несколько часов на отладку абсолютно не связанного кода, только чтобы в конце обнаружить, что это просто ресурсы заглючило.
HPW-Dev
> Чтоб std::embed существовал, надо лимит на размер массива убрать
В Си embed уже есть.
https://godbolt.org/z/hec3Mz1G6
Только что проверил, #embed гигабайтного файла компилируется 25 секунд.
}:+()___ [Smile]
> То, что он мой, никак не уменьшает вероятность, скажем, при переносе проекта этот файл потерять, забыть обновить на новую версию, побить при копировании и т. п.
У меня всё мое лежит в репе, и поэтому "убить несколько часов на отладку" было бы действительно глупо.
При том, что это вроде как что то важное, а в твоём варианте ещё и часть исходников.
Сейчас 2024, и все проекты переносят через git clone, а не на 5" дискетах.
Внешние файлы действительно усложняют дистрибуцию, но раз уж речь о больших проектах - наверно там есть инфраструктура для проверки файлов.
entryway
> #embed гигабайтного файла компилируется 25 секунд.
Есть опасение, что 100 десятимегабайтных будет медленнее.
entryway
> #embed
Прикольно. Надеюсь, так можно любой файл включить. Только вопрос сразу появился, как получить длинну массива.
Ещё для включения файла в exe можно добавить в проект специальный файл на ассемблере. Но это работает только на GCC (MinGW) и возможно на Clang.
iw4nna.rock
> вопрос сразу появился, как получить длинну массива.
sizeof(quine)/sizeof(quine[0])
entryway
> В Си embed уже есть
А поч в c++ нет x)