• Почему выражение (-1ll) в ассемблерном коде MSVC равно ff ff ff ff?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уловка в системе процессорных комманд: 48 c7 45 08 - позволяет загрузить в 64-битную ячейку памяти 32 битное число, автоматически расширяя его до 64 бит.

    Смотрите список кодов x64:
    0x48 - означает, что следующая комманда работает с 64-битами.
    0xC7 - mov immediate (данные в команде)
    Дальше идут флаги, указывающие как интерпретировать аргументы, что куда адресовывать и т.д.

    Но важно, что команда C7 работает с r/m16/32/64 данными, а аргумент у нее может быть только imm16/32 (третий столбец). Т.е. она принимает или 2 или 4 байта, в зависимости от обвеса, а записывать может до 64 бит. Сравните это с коммандой 0xB8 в той же таблице, она уже может принимать 64 бита.

    Если аргумент меньше ячейки памяти, то он расширяется (sign extended) до нужного размера (бит знака копируется влево до упора). Это позволяет записать числено равное значение в более битную ячейку. ведь 32-битное число 0xFFFFFFFF - это -1 в дополнительном бинарном коде, а 0xFFFFFFFFFFFFFFFF - это тоже -1 в дополнительном 64-битном коде.

    Компилятор использует вот эту команду, а не 0xB8, потому что сама команда короче, а исполняется так же быстро. Меньше кода, больше всего помещается в кеш и все работает быстрее, да и exe-шник меньше получается.
    Ответ написан
    2 комментария
  • Понимание аспектов JavaScript?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Строковый примитив преобразуется в объект только при выполнении методов объекта, причём при преобразовании используется копия значения примитива, сама переменная не меняется.
    x = 'foo'
    x // "foo"
    x.length // 3
    x === 'foo' // true
    
    x = new String('foo')
    x // String { "foo" }
    x.length // 3
    x === 'foo' // false

    При этом методы, как правило, возвращают не объекты, а примитивы.
    x = new String('foo')
    x === 'foo' // false
    x.substring(0, 3) // 'foo'
    x.substring(0, 3) === 'foo' // true
    Ответ написан
    Комментировать
  • Как следить за версионностью в клиент-серверном приложении, в выпускаемых фичах продукта?

    Вы пытаетесь решить несуществующую проблему.
    1. Нет никакой проблемы в том что два разных приложения (клиент и сервер) имеют разную нумерацию.
    2. semver нужен только если у тебя есть какой-то контракт, который тебе нужно соблюдать. Если контракта нет - можно использовать просто номера релизов.
    Ответ написан
    3 комментария
  • Почему boolean использует больше памяти чем byte?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    boolean вообще принципиально может использовать 1 бит.
    Но архитектура PC сделана таким образом, что минимальный размер, который мы можем адресовать, это байт.
    Поэтому в языках программирования boolean может иметь разный размер, и скорее всего как минимум 1 байт.

    Можно сделать кастомную реализацию с побитовыми операциями, тогда можно будет засунуть восемь boolean переменных в один байт, но вряд ли есть хоть один язык программирование, где такое будет сделано штатно, ибо это неудобно.
    Читайте доку про ваш язык программирования
    Ответ написан
    2 комментария
  • Почему Linux постоянно обращается к внешнему диску во время простоя?

    ValdikSS
    @ValdikSS
    Если вы недавно создали файловую систему на диске, и особенно если раздел большой (многотерабайтный), то на нём еще могут создаваться inode'ы.
    https://fedetft.wordpress.com/2022/01/23/on-ext4-a...

    Если к диску обращаются программы, обнаружить конкретный процесс или файл поможет эта статья:
    https://habr.com/ru/articles/476414/
    Ответ написан
    1 комментарий
  • Bitbucket фсе, блокирует российские IP?

    ValdikSS
    @ValdikSS
    Заблокировали на ТСПУ у части провайдеров.
    Ответ написан
    1 комментарий
  • Какой аналог метода help Python в c#?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Функция help не делает листинг кода. Она просто выводит докстринг. Я уже миллион лет не писал на C#, но там тоже есть документирующие комментарии. Разница только в том, что документация по ним генерируется отдельной утилитой, а не выводится в REPL функцией.
    Ответ написан
    Комментировать
  • Как пройти путь от эникейщика до DevOps?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Сперва стать сисадмином.
    Настрой мониторинг, подучи парочку скриптовых языков, автоматизируй задачи.
    Разберись с основными продуктами - базы данных, билд системы, гит+код ревью.
    Начни изучать контейнеры и облачные сервисы.
    Для начала хватит.
    Ответ написан
    Комментировать
  • Как пройти путь от эникейщика до DevOps?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Начинать этот путь стоит с автоматизации своей деятельности.
    Ответ написан
    Комментировать
  • Есть ли статьи, которые приводят наглядные примеры того, как код на rust превосходит код на других языках?

    vabka
    @vabka Куратор тега Rust

    Особенно там, где был использован язык Си или С++

    (если исключить memory safety и fearless concurrency)
    1. Хороших плюсовиков найти всё сложнее, ибо молодые разработчики часто хотят что-то более современное/простое/приятное.
    2. Переход с какого-нибудь более высокоуровнего языка на Rust гораздо легче, чем на C++
    3. DX у Rust на порядо лучше.
    4. Код на Rust на порядок более выразительный, чем код на Си

    За счёт этого поддержка кодовой базы на Rust заметно дешевле выходит

    Например вот что Тинькофф пишет:

    Наш Процессинговый Центр занимается разработкой финансовых систем, критичных к даунтайму и времени обработки. Изначально мы делали все свои продукты либо на чистом Си, либо на плюсах (C++14), однако пару лет назад мы переписали большой кусок нашего бэкенда на Rust, и нам настолько понравилось, что теперь все наши новые процессинговые сервисы пишутся на нём.



    Мне бы хотелось видеть какое-то сравнение, что вот так стало сильно лучше и безопаснее, а вот было так написано изначально на оригинальном языке

    Это можно будет определить только если ведётся статистика по багам и они классифицируются по причинам возникновения, но такую статистику ведут не все.
    В среднем статистика показывает, что багов связанных с неправильной работой с памятью в проектах на Rust на порядки меньше, чем в проектах на C++.


    ну тут все-равно unsafe

    В проектах на Rust он явный и от него можно избавиться, завернув в безопасную обёртку, которая будет гарантировать корректную работу с памятью и ffi.
    В проектах на C++ у тебя по факту всё является unsafe.

    ну, нам еще нужен подсчет ссылок

    В плюсах тоже активно пользуются подсчётом ссылок и всякими умными указателями, если по коду не очевидно, когда можно будет освободить память
    Ответ написан
    6 комментариев
  • Как сделать динамическую подгрузку кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    C++ - компилируемый язык. Соответственно, вы содержимое строки в нем никак не исполните, только если не напишите свой интерпретатор или не скомпилируете код в строке как-то подобно JIT. Можно подключить библиотеку с какой-нибудь Lua и код на Lua исполнять. Или подгружать в специально выделенную память скомпилированный заранее (или библиотекой) машинный код и передавать управление ему (но это надо знать ассемблер, про страницы памяти, API операционной системы и все такое. Это очень сложно). Вообще, C++ - не лучший выбор для динамической подгрузки кода.

    defineCode(std::cout << 13 << std::endl); // work
    Работает, потому что тут макрос просто подставляет код в скобках вместо себя и он компилируется и выполняется.

    defineCode(stringLine); заменяется просто на stringLine, что есть бессмысленное выражение, вырезаемое еще на этапе компиляции.
    Ответ написан
    Комментировать
  • Актуальна ли на данный момент Desktop разработка на C# WPF?

    Dmitry Roo вас немного пугает.
    1. Десктоп всё ещё присутствует во всяком корпоративном сегменте - при разработке приложений конкретно для этого бизнеса.
    2. Десктоп всё ещё существует там, где нет надёжного сообщения с сервером. (например как-то имел "удовольствие" увидеть/поразрабатывать софт для судовых механиков, где бы отслеживались разные процедуры/инспекции/отчёты над корабельным оборудованием, а при появлении стабильного соединения - эти отчёты бы отправлялись на сушу.
    3. Десктоп всё ещё существует там, где тебе обращаться к серверу и не нужно. (пример - уже упомянутые профессиональные инструменты для разработчиков, типа dotMemory или dotTrace)

    А если говорить конкретно про WPF - мне кажется, что сейчас понемногу с него уходят либо на другие языки (Flutter тот же) либо переходят на кроссплатформенную Avalonia.
    Ответ написан
    1 комментарий
  • Как разрабатывать игру вместе с другом?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    PSD в репозиторий я бы не стал бы добавлять. Распухнет быстро на жуткие гигабайты. При удалении место не освобождается. Новая версия бинарного файла не дифом, а удалить / добавить.
    Ответ написан
    Комментировать
  • Как решить ошибка при установке Eslint на MacOS?

    Либо вызывай с sudo, либо устанавливай не глобально, а в каждый проект по отдельности.
    Ответ написан
    Комментировать
  • Чем не угодили 2G и 3G?

    @d-stream
    Готовые решения - не подаю, но...
    Это общая тенденция замены оборудования и технологий на следующие поколения. Ближайшие примеры: гужевые повозки и автомобили - они какое-то время сосуществуют, но на автострадах - ни-ни.
    Ну и экономика: в рамках выделенного диапазона частот в сетях новых поколений можно обслужить больше абонентов единовременно. Да и абонентам не очень комфортно наблюдать в местах массового скопления "5 палок и нет связи" лишь по причине занятости всех таймслотов.
    Вторая часть экономики: единовременно содержать сразу два поколения = двойным затратам на содержание.
    Ответ написан
    8 комментариев
  • Что нужно что бы шарить в компьютерных сетях?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Компьютерные сети - это широкое понятие. Чтобы заниматься монтажом кабельных сетей вообще ничего особенного знать не надо, достаточно иметь прямые руки и/или хорошего бригадира. А для разработки нового стандарта беспроводной связи понадобятся и математика и радиофизика.
    Ответ написан
    Комментировать
  • Какая должна быть нумерация релизов для сервисов?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Если сервис не обновляется, ему не нужно поднимать версию

    В целом версии ведутся по semver, через теги
    Ответ написан
    Комментировать
  • Почему postgres не считает null уникальным значением?

    Fragster
    @Fragster
    помогло? отметь решением!
    Это фича (и не только postgres). Поступить - поменять индекс, сделав его не UNIQUE, а UNIQUE NULLS NOT DISTINCT
    (и да, эта фича доступна только в постгре 15. для более ранних версий нужно хранить в этом поле не NULL, а, например, 0 (но тут есть свои нюансы с foreign keys))
    Ответ написан
    4 комментария
  • Уменьшается ли используемая память программы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Не гарантированно, но в некоторых случаев компилятор действительно сможет переиспользовать место на стеке под переменную a для какой-то новой локальной переменной, когда a выйдет из зоны видимости. Но чаще это место просто будет пустым до конца функции и никакой экономии памяти вы не получите.

    Но вообще, делать так для экономии памяти никогда, категорически не рекомендуется. Код становится менее читаем а экономите вы на спичках. Это локальные переменные - они на стеке. Их много можно выделить только рекурсией или большими массивами (ну не объявите вы в коде миллион локальных переменных). В обоих случаях, если стека не хватает - надо или избавлятся от рекурсии/больших массивов изменением логики, или выносить их в кучу.

    Использование фигурных скобок для ограничения зоны видимости переменной действительно используется на практике, когда вам надо ограничить время жизни переменной и добиться вызова деструктора в определенное время. Так делают, например, когда захватывают мютекс в многопоточных программах - специальный класс-обертка в конструкторе его хватает, в деструкторе освобождает. И иногда не надо держать мютекс во всей функции, а только в определенном месте. Допустим, дальше идут долгие вычисления, не требующие мютекса. Тут логично мютекс освободить. Но это должно встречаться редко. Если вам в функции надо несколько раз такое проворачивать, то надо ее отрефакторить и разбить на части.
    Ответ написан
    Комментировать