Оцените прошедший день
Final Results
16%
+2 (прекрасно)
25%
+1
23%
0 (нейтрально)
22%
-1
14%
-2 (ужасно)
В
tl;dr он позволяет делать так:
2. Переменная "затеняется" в следствии чего к оригинальной переменной больше нет доступа и двигать оригинальное значение нельзя
3. Поскольку двигать значение будет нельзя, то можно спокойно создавать
1.
2.
3.
Когда вызываются функции,
Соответственно
Но при создании структур правила другие,
Поэтому то, что стандартная библиотека имеет доступ к приватному полю (как этот доступ работает в макросах это отдельная история) позволяет ей реализовать более удобное API, позволяющее делать вещи вроде
P.S. особо любознательным советую прочитать вот этот огромный комментарий из реализации макроса
std добавили (PR смерджен 2 часа назад, будет в следующем найтли) pin! макрос!tl;dr он позволяет делать так:
let foo: Pin<&mut PhantomPinned> = pin!(PhantomPinned);
stuff(foo);
Он работает аналогично tokio::pin! или futures::pin_mut! — припинивает значение к стеку, не давая ему больше двигаться. Но, в отличии от этих макросов является выражением. pin! из tokio и futures работают примерно так, tokio::pin!(stuff); разворячивается вlet mut stuff = stuff; // (1)1. Проверяет что код владеет значением
let stuff = unsafe { // (2)
Pin::new_unchecked(&mut stuff); // (3)
}
2. Переменная "затеняется" в следствии чего к оригинальной переменной больше нет доступа и двигать оригинальное значение нельзя
3. Поскольку двигать значение будет нельзя, то можно спокойно создавать
Pin
Этот хак работает, но он не очень удобен, т.к. pin!() получается отдельным стейтментом, а не выражением.pin! из std использует другой хак, а конкретно правила по которым работают tmp-значения при создании структур через литерал. std::pin! разворачивается вPin::<&mut _> { pointer: &mut { stuff } }
Но как так? Ведь это же просто создания структуры Pin, как этот код может гарантировать, что stuff не будет двигаться в памяти, менять адрес, инвалидировать ссылки на себя? Давайте разберём по порядку.1.
{ stuff } — это block expression, последнее выражение в блоке "возвращается" из него. это проверка на то, что код владеет stuff аналогичная пункту (1) из tokio/futures pin!. Это же и создаёт анонимную tmp-переменную которая гарантирует (своей анонимностью) что значение не будет двигаться.2.
::<&mut _> говорит что Pin будет параметризован ссылкой на что-то, это не особо важно, но в макросах полезно быть как можно более точными, чтобы потом что-нибудь внезапно не сломалось3.
Pin { pointer: &mut ... } это самая интересная часть, которую не могли повторить макросы из futures/tokio, сейчас объясню почемуКогда вызываются функции,
tmp переменные привязываются к вызову, т.е. f(&{ a }) превращается в{
let tmp = a;
f(&tmp)
} // tmp умирает здесь
Соответственно таким образом нельзя вызвать функции, которые возвращают эту ссылку и потом эту ссылку использовать — tmp на который тут ссылаются к тому моменту уже умрёт.Соответственно
tokio/futures не могли у себя сделать Pin::<&mut _>::new_unchecked(&mut { stuff }) — let a = pin!(stuff) бы просто не работало т.к. пыталось бы вернуть ссылку на tmp, который уже умер.Но при создании структур правила другие,
Struct { field: &{ a } } превращается вlet tmp = a;
Struct { field: &tmp }
в таком случае tmp может жить гораздо дольше!Поэтому то, что стандартная библиотека имеет доступ к приватному полю (как этот доступ работает в макросах это отдельная история) позволяет ей реализовать более удобное API, позволяющее делать вещи вроде
let stuff = pin!(expr);
Которое потом разворачивается в что-то на подобииlet mut tmp = expr;
let stuff = Pin { pointer: &mut tmp };
(и все счастливы)P.S. особо любознательным советую прочитать вот этот огромный комментарий из реализации макроса
Оцените прошедший день
Final Results
17%
+2 (прекрасно)
14%
+1
33%
0 (нейтрально)
17%
-1
20%
-2 (ужасно)
А вы тоже сидите грустные и уставшие, а потом такие
YOU'RE DEAD, ALREADY, DEAD, DEAD, ALREADY-READY
DEAD, ALREADY, DEAD, DEAD, ALREADY-READY
DEAD, ALREADY, DEAD, DEAD, ALREADY-READY
DEAD, ALREADY, deeeeaaaad
и сразу всё нипочём и сразу прыгать хочется?
YOU'RE DEAD, ALREADY, DEAD, DEAD, ALREADY-READY
DEAD, ALREADY, DEAD, DEAD, ALREADY-READY
DEAD, ALREADY, DEAD, DEAD, ALREADY-READY
DEAD, ALREADY, deeeeaaaad
и сразу всё нипочём и сразу прыгать хочется?
cursed-fact-of-the-day: бинарный поиск по массиву из 2^20 элементов примерно на 20% медленнее, чем бинарный поиск по массиву из 2^20 + 123 элементов.
Причина: https://en.algorithmica.org/hpc/cpu-cache/associativity/
Источник: twitter@sergey_slotin
Причина: https://en.algorithmica.org/hpc/cpu-cache/associativity/
Источник: twitter@sergey_slotin
Я cобираюсь продолжать стримить (хоть и не уверен что), в связи чем вопрос: где постить анонсы стримов?
Anonymous Poll
11%
В отдельном канале для анонсов стримов
20%
В этом канале (но только если стрим про программирование)
58%
В этом канале
10%
Я ненавижу стримы пожалуйста не стримь вообще нигде никаких анонсов ааааааааа
Кстати на счёт стримов %)
Через пол часа, в ~18:00 @ twitch.tv/wafflelapkin я буду стримить Ring of Pain. Не знаю как нормально описать, но это игра, рогалик, там есть штуки.
На прошлом стриме я первый раз открыл игру и случайно прошёл её (забег длился всего 3 часа 13 минут), посмотрим что из себя представляет medium сложность хд
Через пол часа, в ~18:00 @ twitch.tv/wafflelapkin я буду стримить Ring of Pain. Не знаю как нормально описать, но это игра, рогалик, там есть штуки.
На прошлом стриме я первый раз открыл игру и случайно прошёл её (забег длился всего 3 часа 13 минут), посмотрим что из себя представляет medium сложность хд
Оцените прошедший день
Final Results
17%
+2 (прекрасно)
29%
+1
31%
0 (нейтрально)
9%
-1
14%
-2 (ужасно)
мне не нравится реальность
Кстати на счёт стримов %) Через пол часа, в ~18:00 @ twitch.tv/wafflelapkin я буду стримить Ring of Pain. Не знаю как нормально описать, но это игра, рогалик, там есть штуки. На прошлом стриме я первый раз открыл игру и случайно прошёл её (забег длился всего…
Вчера я в итоге прошёл игру только один раз (зато на другую концовку и всего за полтора часа!). Большинство попыток кончились ничем.
Мне всё ещё интересно что игра может ещё показать, так что давайте сегодня повторим стрим, в то же время, 18:00 (MSK/UTC+3) @ twitch.tv/wafflelapkin
Мне всё ещё интересно что игра может ещё показать, так что давайте сегодня повторим стрим, в то же время, 18:00 (MSK/UTC+3) @ twitch.tv/wafflelapkin
Оцените прошедший день
Final Results
14%
+2 (прекрасно)
25%
+1
34%
0 (нейтрально)
17%
-1
11%
-2 (ужасно)
А никто не знает, где можно иммутабельно сохранить фотку?
Хочу в коммит добавить ссылку на фотографию, но не хочу её добавлять в сам репозиторий.
Хочу в коммит добавить ссылку на фотографию, но не хочу её добавлять в сам репозиторий.
Оцените прошедший день
Final Results
11%
+2 (прекрасно)
26%
+1
26%
0 (нейтрально)
13%
-1
24%
-2 (ужасно)
Оцените прошедший день
Final Results
19%
+2 (прекрасно)
26%
+1
36%
0 (нейтрально)
11%
-1
7%
-2 (ужасно)
Оцените прошедший день
Final Results
9%
+2 (прекрасно)
24%
+1
35%
0 (нейтрально)
15%
-1
17%
-2 (ужасно)