• Какая разница на практике между clang и gcc?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Однажды я на подобный вопрос уже отвечал, правда там вопрос был о кроссплатформенности, а не о трансляторах.

    Какая разница между clang и GCC.
    Разница большая. GCC обладает обширной поддержкой наследия идиом и конструкций из языка C, которые, вынужденно или по своей воле, поддерживает в современном C++.
    VLA, тип по умолчанию, всевозможные изыски синтаксиса C. Это все GCC не глядя принимает за C++ код и позволяет трансляцию.
    GCC даже сегодня многократно нарушает стандарты C++ просто потому что выбрал стратегию поддержки экзотической функциональности C в коде C++. Так же GCC не хвастается и скоростью поддержки стандартов C++.
    В 2016 году Google полностью отказались от поддержки GCC в Android NDK из-за слишком плохой поддержки стандартов и слишком свободного следования стандартам C++. В этот момент GCC стал неконкурентоспособным относительно оставшихся двух самых широко используемых трансляторов.
    Clang же, наоборот, сегодня считается, буквально, бастионом идеального следования стандартам C++. Clang точно поддерживает стандарты во всех деталях, максимально быстро интегрирует изменения и добавления стандартов, позволяет в самых первых рядах поиграться с функциональностью из драфтов следующего стандарта C++.
    Clang обладает обширной системой статической и динамической проверки кода: богатый статический анализ, возможность подключения санитайзеров, поддержка C++ Core Guidelines, очень качественные отчеты об ошибках трансляции, хорошая скорость трансляции.
    Это все ставит clang в предпочтение перед GCC на третьих для GCC платформах.

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

    Я в своей работе видел многое. Я видел как при смене GCC на clang люди хватались за голову и отказывались от последнего просто потому что он нашел горы нарушений стандарта, которые молча принимал GCC. Я видел как группа из 5 человек 3 месяца рефакторила код при переходе с MSVS2015 на MSVS2017 (т.е. просто при смене версии транслятора) просто потому что разработчики из рук вон плохо знают используемый ими стандарт C++.
    Я видел ошибки в clang, приводящие к неверной генерации кода. Я видел ошибки в GCC, не позволяющие использовать его для кроссплатформенной сборки. Я видел ошибки в MSCL, в результате которых последний явно нарушает стандарт, а команда его разработки отказывается это исправлять потому что "иди нафиг".

    И, тем не менее, конкретно у меня есть возможность писать код ровно один раз и собирать его на 5 совершенно разных целевых платформ совершенно разными трансляторами, на которых этот код работает абсолютно равнозначно. Просто потому что я знаю стандарт и то, как этот стандарт поддерживают выбранные мной трансляторы.
    Ответ написан
    3 комментария
  • Как замерять время выполнения функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как замерять время выполнения функции?

    Можно воспользоваться парой clock_gettime / clock_getres.

    как можно искусно замедлить выполнение

    Можно организовать искусный цикл вокруг замеряемой функции и разделить его общее время выполнения на количество итераций. Но детали зависят от того, какое именно время вы там пытаетесь померить. Т.е. если там важны эффекты от кеша, то тупой цикл может быть недостаточно искусным.
    Ответ написан
    Комментировать
  • Как избежать дублирования последней строки из файла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам надо проверять, что вернет fscanf. Если оно у вас вернет что-то меньшее 2, то значит оно не смогло прочитать обе строки. В этом случае надо выходить из цикла и не класть новую запись в таблицу
    Ответ написан
    Комментировать
  • Форматирование смонтированного диска?

    @pfg21
    ex-турист
    ничего не будет.
    ты монтируешь носители не один в другой, а все носители в VFS - виртуальный файловый распределитель это демон, который и разбирается в какой подключенный драйвер файловой системы отправить файловые запросы от пользователя.

    просто обычно есть один носитель, который монтируется как корень "/" но его вполне нормально можно отмонтировать или перемонтировать, ничего не делая с монтированными в /mnt носителями. и т.д.
    они никаким образом меж собой не связаны.
    Ответ написан
    Комментировать
  • Принёсет ли дивиденды изучение модулей С++20?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Знание определенной особенности синтаксиса языка не является основным критерием приема на работу на должность разработчика на C++, потому что оно приобретается за один (1) вечер - путем изучения учебника и реализации пары примеров из него же.
    Ответ написан
    Комментировать
  • Как задать значение последней переменной?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Имеется код вида
    int64_t a = b/c
    b и c какие-то произвольные числа
    требуется записать 0 в переменную a, если произошел SIGFPE.
    Проверять значения b и c не вариант, нужно как-то задавать значение для a в обработчике сигнала.

    Задача в такой постановке выглядит странной, если это не просто учебная задача на обработку сигналов.
    Если это учебная задача -- то конечно, и ассемблерная вставка тут может помочь, но это не вопрос для тостера.
    Если это практическая задача, то решить её можно следующими способами:

    - наиболее простой и переносимый, но не самый быстрый -- таки проверить значения b и c перед вычислениями.

    - следующий по простоте -- использовать setjmp перед началом блока вычислений который может закончиться сигналом, в обработчике сигнала вызвать longjmp, после возврата присвоить результатам нужные значения.

    - следующий вариант -- нифига не простой и не переносимый -- устанавливать обработчик сигнала с помощью sigaction, заказывать доставку SA_SIGINFO и анализировать ucontext (третий аргумент) в обработчике сигнала. Сложность заключается в том, что связь между тем, что будет записано в ucontext и исходным кодом на C ни разу не очевидна. Т.е. можно извлечь из памяти по адресу info->si_addr инструкцию вызвавшую сбой, проанализировать её длину и куда она записывает результат, записать в результат 0 и передвинуть адрес возврата. Но это выглядит как неоправданное количество мороки.
    Ответ написан
  • Как ограничить конфиг openvpn по времени?

    @Mikeoldfield
    Сетевой инженер / системный администратор
    Если по сертификату - то ставишь срок действия один месяц и всё.
    Ответ написан
    1 комментарий
  • Какой выбрать VPN сервер для обхода блокировок?

    @Drno
    https://antizapret.prostovpn.org/selfhosted.html

    при желании можно будет добавить свои сайты. разворачивается в контейнер, реальной настройки - 5 минут
    Ответ написан
    2 комментария
  • Сначала merge, потом push или наоборот?

    GavriKos
    @GavriKos
    Ну а вы понимаете что делает git push? В целом то валиден и 1 и 2 вариант, только для разных ситуаций
    Ответ написан
    Комментировать
  • Алгоритм двоичного поиска. Почему неправильно работает алгоритм?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Знаки в условиях перепутаны.
    Ответ написан
    Комментировать
  • Что делать, если появляется непонятная ошибка после запуска c++ кода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что делать, если появляется непонятная ошибка после запуска c++ кода?

    Пытаться понять её -- универсальный рецепт.

    это исходный код.
    thread my_thread1(&connecter);
    if(connfd == true)

    В этом месте две ошибки. Первая -- ты сравниваешь int connfd с bool true, а вторая -- ты делаешь это без уважения потоконебезопасным способом. Прямо скажем, у тебя тут гонка между main и connecter. Когда ты эту гонку исправишь, жизнь твоя, скорее всего, наладится. Непонятно, правда, зачем ты вызываешь accept в параллельном потоке вместо того, чтобы сделать это синхронно, прямо в main.
    Ответ написан
    Комментировать
  • У меня несколько ошибок "was not declared in this scope" в коде C++, что делать?

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

    И так по каждой ошибке от компилятора в вашем вопросе. Смотрите на какое имя он ругается и где эта функция/переменная определена.
    Ответ написан
    1 комментарий
  • Почему некоторые сайты определяют оригинальный адрес (вместо VPN)?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Потому что "впн для браузера" - это не впн, а прокси.
    Ответ написан
    Комментировать
  • Почему некоторые сайты определяют оригинальный адрес (вместо VPN)?

    XOR2048
    @XOR2048
    Web & Browser extension developer
    VPN в расширениях не бывает, это маркетинговая уловка. Любое расширение, которое говорит, что это VPN - лжет.
    Расширения для браузера могут предоставлять только proxy услуги.
    Ответ написан
    Комментировать
  • Какую утилиту выбрать для мониторинга действий пользователя в сетевом окружении?

    На сервере, где хранятся данные и к которым по сети получают доступ включить аудит доступа к файлам
    https://habr.com/ru/post/150149/
    Ответ написан
    Комментировать
  • Как найти нужный каталог в cmd?

    hint000
    @hint000
    у админа три руки
    В команде set уберите пробелы до и после знака равенства:
    set disk=C:\
    Ответ написан
    2 комментария
  • Как перегрузить оператор так, чтобы принимать std::endl в своём потоке вывода?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вот тут есть примеры сигнатуры функции: https://en.cppreference.com/w/cpp/io/basic_ostream...
    basic_ostream& operator<<(
        std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
    Ответ написан
    Комментировать
  • Может ли VPN скрыть факт использования Tor для DPI?

    @Drno
    Если допустим Вы настроили ovpn на своем личном серваке, подключились с проверкой сертификата, и пустили весь трафф внутрь,
    то внутри него провайдер ничего не увидит.
    Он увидит только шифрованное ovpn соединение и всё
    Ответ написан
    Комментировать
  • Почему содержимое пакетов в Wireshark не совпадает с описываемым в спецификации протокола IP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы смотрите заголовок Ethernet-кадра, который передаётся в пределах локальной сети. Заголовок IPV4 начинается дальше с октета 0xE.
    Ответ написан
    Комментировать
  • Как конвертировать указатель PWSTR в указатель на string (c++)?

    Adamos
    @Adamos
    std::string down(PWSTR pointer)
    {
      std::wstring w(*pointer);
      std::string s(w->c_str());
      return s;
    }

    Вот только то, что хочет std::string, может предполагать, что текст в ней будет в однобайтной кодировке, и если это элементы UI, например - кириллица после такого "преобразования" пойдет кракозябрами. Да и латинице может поплохеть.
    Так что, скорее всего, нужно не типы конвертировать, а кодировки.
    Ответ написан
    Комментировать