Интересный RFC про исправление uninitialized::<!>

4 лайка

Хороший, годный RFC, который наконец-то приняли (всего-то через год).

Согласен, годный РФЦ.

Можно на русском, пожалуйста?

А мне вот ненравится, что uninitialized - функция этапа выполнения, а не макрос этапа компиляции.

mem::uninitialized::<!> возвращает тип !, что значит что данная функция не возвращает управление, что значит что всё после неё мёртвый код и его можно выбросить.

Э? Я думал, во время выполнения эта “функция” ничего не делает. Она же память не выделяет?

Выделяет память конечно же. Поэтому она не может быть макросом. Что ты имеешь ввиду?

Как я понимаю, не выделяет - а “просит” незаполнять память нулями.

Мне бы где-то статическую переменную завести неинициализированную, и где-нибудь в мэйне ее присвоить.

Выделяет и просит ничего не делать. Системный аллокатор памяти (jemalloc или обычный из libc) обычно выдаёт неинициализированную память.

Вот. И макрос мог бы выделять в рантайме, а и при компиляции, если это статик, то просить, чтобы компилятор выделил.

Ничего не понимаю.

Статические данные будут положены в .data и проинициализируются нулём в любом случае.

Зачем ты хочешь статик, который не инициализирован?

Чтобы не инициализировать их явно. Допустим, у меня в структуре тыща полей, и они все инитятся в меине.
Если я хочу себе такую глобальную переменную, то я вынужден их все перечислить и инициализировать. А мне это ненужно, потому что из меин оно все равно перетрется.

lazy_static! в этом случае тоже плох - так как в него нельзя передавать аргументы.