Перейти к содержимому

Пост канала

Rust
  1. ⚡️ Забудь про RefCell для примитивов Вам нужно изменить поле внутри неизменяемой структуры (&self). Рука тянется к RefCell? Стоп. RefCell имеет оверхед: 1. Хранит счетчик заимствований (borrow count). 2. В рантайме проверяет правила (может паниковать!). Если ваш тип реализует Copy (числа, bool, маленькие структуры) - используйте Cell. В чем магия Cell? У него нет никакого рантайм-оверхеда. Вообще. Он не проверяет заимствования. Он работает так: "Я даю тебе копию значения" (get) или "Я заменяю значение целиком" (set). Вы не можете получить ссылку (&) на содержимое Cell, поэтому правила Rust не нарушаются. use std::cell::Cell; struct Metric { count: Cell<u64>, // Zero overhead } impl Metric { fn inc(&self) { // Мы меняем значение по неизменяемой ссылке &self let current = self.count.get(); self.count.set(current + 1); } } Это атомарно? Нет. Это работает только в одном потоке. Но для однопоточного кода (или внутри thread_local) это самая быстрая мутабельность, которая только возможна. #rust #std #optimization #interior_mutability 👉 @channel_rust_lib

    Открыть в MAX
    Просмотры
    368
    ER
    1,4%
    Реакции
    5