Задать вопрос
  • Как транспонировать биты числа максимально быстро?

    @arteast
    Если вопрос стоит в том, как это сделать средствами исключительно логических операций - то см. ответ Wataru. 17 бинарных логический операций, если я правильно посчитал (с учетом того, что сдвиги на 9 и -9 можно маскировать совместно).
    Если можно использовать LUT - то LUT, вероятно, будет выгоднее. Учитывая, что преобразование линейное - таблицу можно делить на части, выбирая между скоростью и памятью. Например, можно поделить на 2 части - отдельные таблицы для каждой половины из 16-битного входа, и получить расход 1кб памяти, 3 логических операции и два хождения в LUT.
    Если речь о x86 cpu и можно использовать специфичные инструкции - то еще можно посмотреть в сторону sse/avx. Например, разбить вход побитово на байты и pshub, или (если есть XOP/AVX512) броадкаст его и vprotw/vpsllvw, или же vpshufbitqmb, или же vpermb,... Куча возможных вариантов.
    Ответ написан
    Комментировать
  • Как исправить ошибки компиляции Clang под Linux?

    @arteast
    gmtime_s - это изначально была нестандартная функция, придуманная Microsoft (хотя и полезная). Ее и прочие "safe"-функции от MS стандартизировали в C11, но отдельным пакетом - Annex K - и как необязательные к реализации. См. на той странице, что вы указали:
    As with all bounds-checked functions, gmtime_s only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including .


    gcc/glibc и clang/libc не определяют __STDC_LIB_EXT1__ и не поддерживают эти функции.

    Также есть функция gmtime_r, которая решает ту же проблему, что и gmtime_s - она гарантированно будет в реализации стандартной библиотеки, но только в C23, т.е. в распоследних версиях компиляторов, которые эту версию поддерживают. Или _может быть_ как расширение - к примеру, на gcc она доступна при наличии макроса __USE_POSIX.

    Отвечая на вопрос - не используйте gmtime_s, если хотите хорошую портабельность кода. Либо
    • использовать свежайшее всё, C23 и gmtime_r,
    • либо прагматичный, но несовсемпортабельный подход - впиливать в cmake и код выбор - на msvc библиотеке использовать gmtime_s, на libc/glibc - __USE_POSIX и gmtime_r
    • либо, раз уж вы используете C++, то еще можно подвинуться на C++20 и C++-ные year_month_day и hh_mm_ss.


    Похожая история с mbstowcs_s - тот же Annex K и нереализованность на других библиотеках. Используйте mbsrtowcs и иже с ним.
    Ответ написан
    Комментировать
  • Как можно починить std::thread?

    @arteast
    На самом деле ругается, судя по логам, не на эту строчку, а чуть ниже на:
    threads.push_back(t);
    Объект std::thread некопируемый, а в этой строчке делается копия. Надо либо делать через move, либо вообще избавиться от t и вставлять анонимный объект, либо вовсе не создавать объект, а использовать emplace_back (чтобы vector сам создал объект).
    Ответ написан
    Комментировать