Задать вопрос
  • При добавление элементов в вектор, при превышении capacity, это приведет к перераспределению Vec?

    fenrir1121
    @fenrir1121
    Начни с документации
    При превышении capacity адрес может измениться.
    Довольно банальная оптимизация - если впереди необходимая память свободна, расширение происходит на месте, без переноса.

    Проверить можно так
    fn main() {
        let mut vec = Vec::with_capacity(2);
        let initial_ptr = vec.as_ptr();
    
        let (new_ptr, new_capacity) = std::iter::repeat(())
            .enumerate()
            .find_map(|(i, _)| {
                vec.push(i as i32 + 3);
                (vec.as_ptr() != initial_ptr).then(|| (vec.as_ptr(), vec.capacity()))
            })
            .unwrap();
        println!("Initial ptr: {:?}", initial_ptr);
        println!("New ptr: {:?}", new_ptr);
        println!("New capacity: {}", new_capacity);
    }
    Ответ написан
    Комментировать
  • Как определить свой уровень программирования?

    Lord_of_Rings
    @Lord_of_Rings
    Дунадан - северный странник. Злой, но очень добрый
    Если твой код иногда работает, то поздравляю - ты Junior. Если понимаешь, почему не работает, то ты уже на пути в Middle'ы. А если уже ненавидишь себя за выбор пути и задумываешься о домике на берегу реки - добро пожаловать в Senior'ы
    Ответ написан
    8 комментариев
  • Сайты для государственных учреждений нужно делать только на Битриксе?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нет.
    Ответ написан
    Комментировать
  • После включение Secure Boot тупит компьютер, что делать?

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    выключи Secure boot в биосе
    Ответ написан
    Комментировать
  • IT с медицинским образованием - реально?

    Разработка мндицинского по
    Ответ написан
    1 комментарий
  • Как упростить и убыстрить процесс переноса правок с docker на прод?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    То, что вам нужно называется "автоматизация доставки и развёртывания". CI/CD и прочее. На вашем сервере один раз настраиваете деплой с гит-репозитория и далее просто вносите ваши изменения в репозиторий, а дальше по скрипту всё само задеплоится. Только не забудьте настроить и отладить процесс отката изменений на любую другую версию.
    Ответ написан
    4 комментария
  • В каких случая стоит использовать usize?

    bingo347
    @bingo347
    Crazy on performance...
    Для операций сводящихся к арифметике указателей.
    Помимо непосредственно арифметики указателей сюда относятся индексация и длина слайсов/массивов/векторов/строк, capacity вектора/строки, размеры и выравнивание типов, смещение полей относительно начала структуры.
    Но в целом, где удобно, там и используйте, никто не запрещает использовать usize/isize как и другие int типы
    Ответ написан
    2 комментария
  • Как установить новый Android на Samsung Galaxy A3 (SM-A310F)?

    @Drno
    никак. сменить телефон
    а пишет что "файл не найден" потому что надо быть зарегистрированным
    Ответ написан
    Комментировать
  • Можно ли тянуть от оператора два кабеля интернета?

    @elderl
    Можно. Половина будет на одном, другая — на втором.
    Ответ написан
    3 комментария
  • Как настроить перенос текста через максимальную ширину, как в html?

    Ankhena
    @Ankhena
    Нежно люблю верстку
    Фикс размеры
    67f645d756e5b902308030.jpeg
    Левее - фикс ширина
    Ответ написан
    1 комментарий
  • Как проверить перемещается ли в памяти объект при "перемещении"?

    bingo347
    @bingo347
    Crazy on performance...
    При перемещении адрес на стеке изменится, а адрес памяти выделенной на куче - нет.
    Тут очень тонкий момент, который нужно понимать, данные которые мы помещаем в Box или Vec будут размещены на куче, но сами Box и Vec - это такие же структуры, как и любые другие, просто на них есть некоторая логика для управления памятью на куче, в случае 64 битной архитектуры и T: Sized, Box<T> будет занимать 8 байт на стеке и размер T на куче, а Vec<T> - 24 байта на стеке (указатель на начало, длина и фактически выделенная память) и размер T умноженный на capacity на куче.

    fn main() {
        let a = Box::new(42);
        println!("Stack address of a: {:p}", &a);
        println!("Heap address of a: {:p}", &*a);
        
        let b = a;
        println!("Stack address of b: {:p}", &b);
        println!("Heap address of b: {:p}", &*b);
    }
    Stack address of a: 0x7fff59586010
    Heap address of a: 0x58cf76717b10
    Stack address of b: 0x7fff59586018
    Heap address of b: 0x58cf76717b10
    Ответ написан
    Комментировать
  • Почему i? Почему переменную, используемую в циклах, обычно называют именно i?

    @alexalexes
    index. А вообще, индексы элементов массива пришли из математики - i, j, k для первых трех измерений.
    Просто, первыми компухтеры оседлали математики, отсюда и традиция в циклах использовать эти буквы.
    Ответ написан
    2 комментария
  • Rust как подключить внешний файл в модуле?

    bingo347
    @bingo347
    Crazy on performance...
    Структура модулей в крейте с точностью повторяет структуру файлов на диске, даже если модуль объявлен внутри модуля не вынесеного в отдельный файл.
    То есть одно и то же объявление mod db;будет искать файл в разных местах, в зависимости от того, где оно написано:
    • если написать в корне src/lib.rs то будет искать src/db.rs или src/db/mod.rs
    • если написать в модуле cmd внутри src/lib.rs то будет искать src/cmd/db.rs или src/cmd/db/mod.rs

    Но у меня большое подозрение, что Вы вообще не понимаете, как работает ключевое слово mod, ибо напихали его где только можно, включая сам db.rs (там будет искать src/db/db.rs кстати). Ключевое слово mod подключает модуль как дочерний того модуля, где оно написано. А для импорта имён нужно использовать use.

    И как верно подметил fenrir, если бы Вы внимательно прочитали растбук, то Вы бы это поняли.
    Ответ написан
    3 комментария
  • Rust как подключить внешний файл в модуле?

    fenrir1121
    @fenrir1121
    Начни с документации
    Я уже 3ч маучаюсь с этой ошибкой...
    А мог за 15 минут прочитать 7 главу растбука, где все разобрано.
    Ответ написан
    5 комментариев
  • Как перевести vanilla js класс в react среду?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    «Некоторую информацию» нужно хранить в стейте или менеджерах, «работать с DOM» нужно средствами Реакта, а для истории использовать соответствующие библиотеки. И вот от класса ничего не осталось, можно его удалить.
    Ответ написан
    Комментировать
  • Совместима ли материнка и этот блок питания?

    @apppostol
    Совместимы.

    ps.
    Вообще конечно про совместимость надо думать ДО покупки)
    И там в компе есть еще другие штуки, которые тоже требуют внимания касаемо совместимости.
    Ответ написан
    9 комментариев
  • Почему именно такой порядок вывода в консоль?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Исследования в первоначальной версии ответа (ниже) натолкнули на поведение, которое смог объяснить Jonas Wilms в ответе на SO.

    Возврат промиса из C1 then() создаёт ТРИ последовательных микротаска:
    1. NewPromiseResolveThenableJob, который вызывает then() на том уже отресолвленном промисе, что вернули в C1. И т.к. этот промис уже отресолвлен, сразу же в очередь вставляется следующий микротаск:
    2. NewPromiseReactionJob этого уже разрешенного промиса, и этот, в свою очередь, добавляет третью микрозадачу:
    3. ещё одну NewPromiseReactionJob, которая уже выводит в лог "2".


    Если возвращать не промис (и не thenable объект), а "простое" значение или undefined, то добавляется всего один микротаск.

    Раньше подобная задержка в три шага была и для await, но потом её оптимизировали в движке V8. А вот про then() забыли.

    Подробнее стоит посмотреть ответ на SO, ссылка в начале.

    [первая версия ответа]

    Интересный вопрос! Больше экспериментов.
    Вспомогательная функция для читаемости:
    const log = (value, returnPromise) => () => {
      console.log(value);
      if (returnPromise) return Promise.resolve();
    };
    Возвращает функцию, которая обычный console.log() с переданным значением. И если второй аргумент трушный, то вернёт отрезолвленный промис.

    Эксперимент 1. «Застёжка-молния»
    Promise.resolve()
      .then(log('a1'))
      .then(log('a2'))
      .then(log('a3'))
      .then(log('a4'))
      .then(log('a5'))
      .then(log('a6'))
    ;
    
    Promise.resolve()
      .then(log('b1'))
      .then(log('b2'))
      .then(log('b3'))
      .then(log('b4'))
      .then(log('b5'))
      .then(log('b6'))
    ;
    Выводит поочередные a1 b1 a2 b2 a3 b3 ...
    Эксперимент 2. «Отстаём на 2»

    Единственное отличие: в первом А возвращаем отресолвленный промис.
    Promise.resolve()
      .then(log('a1', true))
      .then(log('a2'))
      .then(log('a3'))
      .then(log('a4'))
      .then(log('a5'))
      .then(log('a6'))
    ;
    
    Promise.resolve()
      .then(log('b1'))
      .then(log('b2'))
      .then(log('b3'))
      .then(log('b4'))
      .then(log('b5'))
      .then(log('b6'))
    ;

    Выводит
    a1 b1 b2 b3 a2 b4 a3 b5 a4 b6 a5 a6
    А-шки после 1-й отстают на 2, пропустив вперёд b2 и b3.

    Очередь микрозадач работает как FIFO буфер: первый пришёл, первый ушёл.

    Цепочка из then() выполняется асинхронно. После выполнения очередного, создаётся следующий microtask. Несколько цепочек, как видно из 1-го эксперимента, выполняются параллельно-пошагово, «молнией».

    Возврат созданного выполненного промиса, и ожидание его разрешения вызывает задержку в очереди микрозадач на 1 микротаск + «перемещение» цепочки "А" в конец (меняется порядок a-b => b-a):
    "молния"
    a1 b1 ; a2 b2 ; a3 b3 ; a4 b4 ; a5 b5 ; a6 b6
    
    с промисом в А1
    a1 b1 ; b2 ; b3 a2 ; b4 a3 ; b5 a4 ; b6 a5 ; a6


    Подробнее с тремя цепочками

    На этот раз три цепочки промисов "a", "b", "c". Цепочка "А" вернёт промис на 1-м шаге, "С" — на 4-м. Код эксперимента:
    const output = [];
    
    const makeChain = (key, n = 5, trueStep = false) => {
      let p = Promise.resolve();
      const arrow = isArrow => isArrow ? '->' : '';
      for (let i = 1; i <= n; i++) {
        const returnPromise = trueStep === i;
        const afterPromise = trueStep === i - 1;
        p = p.then(() => {
          output.push(`${arrow(afterPromise)}${key}${i}${arrow(returnPromise)}`);
          if (returnPromise) return Promise.resolve();      
        });
      }
      return p.catch(console.error);
    };
    
    const n = 7;
    makeChain('a', n, 1),
    makeChain('b', n),
    makeChain('c', n, 4),
    
    // мАкрозадача выполнится после всех мИкрозадач:
    setTimeout(() => console.log(output.join(' ')));

    Результат c вручную добавленными разбивками:
    a1-> b1 c1 ; b2 c2 ; b3 c3 ->a2 ; b4 c4-> a3 ; b5 a4 ; b6 a5 ; b7 ->c5 a6 c6 ; a7 c7
    Тут всё ещё не вполне мне понятен порядок после возврата промиса из C4.
    Ответ написан
  • Как загрузится с установочной флешки Arm Debian на M1?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Никак. Mac arm официально поддерживает только MacOS и не поддерживает другие ОС. Есть один полусырой проект линукса - что-то там даже работает, в целом же вообще не юзабельная система. Название не помню, но легко гуглится. Поэтому если хотите запустить арм линукс на маковской арм платформе - используйте докер, VirtualBox, UtmApp или qemu.
    Ответ написан
    Комментировать
  • Как выбрать телевизор чтобы использовать его как монитор?

    VoidVolker
    @VoidVolker Куратор тега Железо
    Dark side eye. А у нас печеньки! А у вас?
    Как выбрать телевизор чтобы использовать его как монитор?

    Купить монитор, а не телевизор.

    очень важно чтобы глазам было комфортно
    чтобы не уставали

    • Брать монитор на матрице IPS (есть хорошие варианты на OLED - но я его не юзал, так что ничего конкретного про него не скажу)
    • Желательно изогнутый - ибо уже на сорока трёх дюймах искажения в углах заметны, если конечно монитор на столе, а не на стене в трёх метрах
    • Разместить монитор в правильном положении на правильном расстоянии от глаз
    • Организовать правильное освещение рабочего места
    • Использовать приложения типа f.lux
    • Делать регулярно перерывы между работой
    • Делать регулярно физические упражнения для глаз, шеи, спины и прочих частей тела и не раз в неделю, а каждый день или даже несколько раз в день (главное соблюдать нагрузку и регулярность - тут не тяжёлая атлетика нужна)
    Ответ написан
    8 комментариев