https://github.com/llvm/llvm-project/pull/68620
ПОСОНЫ, ТУТ #embed ВЛЕТЕЛ В ШЛАНГ, теперь заживем!
upd1: пока ревертнули, чтобы починить билдботов, но работа идет!
Вкратце (нет):
#embed - это новая директива препроцессора, позволяющая НОРМАЛЬНО добавлять бинарные файлы в ваш исходный код (пока что на языке Си, но в C++ оно тоже скоро просочится). Если вы используете какие-то бинарные данные типа картинок, сырых двоичных ключей, гуидов, и пр., то эта фича для вас, и это то, что вы ждали 10 лет в Азкабане 40+ лет с момента создания сишки!
Пример кода:
// firmware_sound.c
const char wave_buf[] =
#embed "notification.wav"
; // добавим бинарный файл сразу в прошивку
Текущие подходы состоят из лютых костылей типа скриптов, которые печатают бинарь как массив; xxd; bin2c (очень распространен в определенных кругах) и прочие более-менее кривые (или) нет скрипты на ваших любимых языках оболочки типа cmd/bash/fish/python.
Эта бумага пережила 12 ревизий и готовилась примерно 5-6 лет!!! (включая прошлую версию, в которой также был std::embed - consteval-функция, которая делает то же самое, но на этапе компиляции, а не препроцессинга).
Автор потратил кучу нервов и сил (почитать его слезы и посочувствовать можно в его блоге здесь (обзор и бенчмарки - [1]), здесь (подход с языком Circle и бенчмарки - [2]) здесь (заметки для критиков - [3]), здесь (заметка о том, что принято в C23 и будет поэтому в C++26 - [4])). Его долго пинали в комитетах, то говорили, что это будет медленно работать (бенчмарки показали обратное, см. ниже), то говорили, чтобы он придумал "более generic"-подход, в стиле языка Circle, который, грубо говоря, является C++ с возможностью выполнять любой код на этапе компиляции, главное, пометить блок/функцию собачкой (@).
Бенчмарки из статьи [2] выглядят так:
Методология | Время
----------------+--------------
#embed | 17 seconds
std::embed | 16 seconds
#include, |
сгенерированный | 621 seconds
xxd | (КАРЛ!!!!)
Теперь эта фича уже точно будет в Clang 19 (кому не терпится, соберите текущий trunk и радуйтесь), в MSVC есть тикет на добавление, в GCC тоже (для нетерпеливых есть патч в тикете, можете собрать).
Поздравляю автора с этим достижением, и просто убеждаюсь, что в каждом меме есть доля шутки 😢
#длиннопостик #cpp #std_embed #thephd
ПОСОНЫ, ТУТ #embed ВЛЕТЕЛ В ШЛАНГ, теперь заживем!
upd1: пока ревертнули, чтобы починить билдботов, но работа идет!
Вкратце (нет):
#embed - это новая директива препроцессора, позволяющая НОРМАЛЬНО добавлять бинарные файлы в ваш исходный код (пока что на языке Си, но в C++ оно тоже скоро просочится). Если вы используете какие-то бинарные данные типа картинок, сырых двоичных ключей, гуидов, и пр., то эта фича для вас, и это то, что вы ждали 10 лет в Азкабане 40+ лет с момента создания сишки!
Пример кода:
// firmware_sound.c
const char wave_buf[] =
#embed "notification.wav"
; // добавим бинарный файл сразу в прошивку
Текущие подходы состоят из лютых костылей типа скриптов, которые печатают бинарь как массив; xxd; bin2c (очень распространен в определенных кругах) и прочие более-менее кривые (или) нет скрипты на ваших любимых языках оболочки типа cmd/bash/fish/python.
Эта бумага пережила 12 ревизий и готовилась примерно 5-6 лет!!! (включая прошлую версию, в которой также был std::embed - consteval-функция, которая делает то же самое, но на этапе компиляции, а не препроцессинга).
Автор потратил кучу нервов и сил (почитать его слезы и посочувствовать можно в его блоге здесь (обзор и бенчмарки - [1]), здесь (подход с языком Circle и бенчмарки - [2]) здесь (заметки для критиков - [3]), здесь (заметка о том, что принято в C23 и будет поэтому в C++26 - [4])). Его долго пинали в комитетах, то говорили, что это будет медленно работать (бенчмарки показали обратное, см. ниже), то говорили, чтобы он придумал "более generic"-подход, в стиле языка Circle, который, грубо говоря, является C++ с возможностью выполнять любой код на этапе компиляции, главное, пометить блок/функцию собачкой (@).
Бенчмарки из статьи [2] выглядят так:
Методология | Время
----------------+--------------
#embed | 17 seconds
std::embed | 16 seconds
#include, |
сгенерированный | 621 seconds
xxd | (КАРЛ!!!!)
Теперь эта фича уже точно будет в Clang 19 (кому не терпится, соберите текущий trunk и радуйтесь), в MSVC есть тикет на добавление, в GCC тоже (для нетерпеливых есть патч в тикете, можете собрать).
Поздравляю автора с этим достижением, и просто убеждаюсь, что в каждом меме есть доля шутки 😢
#длиннопостик #cpp #std_embed #thephd