Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (11)

Лучшие ответы пользователя

Все ответы (16)
  • Почему мне кажется, что Python быстрее C?

    @menkar3
    Вкратце - в теории, при правильном написании быстрее написанного человеком кода на си может быть только код, написанный человеком прямо на асме. На практике - код на асме, скорее всего, будет медленнее - компилятор си знает кучу всего, чего человек может не знать/не учесть, так что сгенерит код эффективнее.
    По этому случаю - тут слишком много вопросов)
    Какая ось? Чем собирали сишный код? Может, c код вы в дебаге собрали?)
    Ну вот пример убунты (python3 vs gcc)
    Раз вы говорите про заметную разницу на 300000 итераций давайте просто поставим лимит в 500000 и сравним утилиткой time:
    #include <stdio.h>
    
    int main()
    {
      int i = 0;
      while(i != 500000) {
        printf("%i\n", i);
        i += 1;
      }
      return 0;
    }

    Против
    i = 0
    while i != 500000:
      print(i)
      i += 1

    Смотрим, что вышло:
    $time python3 test.py 
    ...
    499999
    real	0m6.472s
    user	0m0.985s
    sys	0m1.063s

    6 с копейками секунд. Теперь сравним с решением на c, которое скомпилим по дефолту gcc test.c:
    $time ./a.out 
    ...
    499999
    real	0m3.241s
    user	0m0.234s
    sys	0m0.749s

    3 с копейками секунды.
    Уже как-то расходится с вашими наблюдениями, так что вопрос про систему/компилятор/параметры сборки сишного кода актуален)
    Не говоря уже о том, что (как сказали выше) замеры скорости по выводу в консоль - вообще плохая идея
    Ответ написан
  • Поможет ли вынос работы с крэшащейся библиотекой в отдельный поток от крэша всего приложения?

    @menkar3
    Вкратце - скорее всего нет. Кроссплатформенно - еще более сомнительно.
    Как именно крашится либа? Я так понял, это не вылетевшее C++ исключение, а что-то вроде коррапта памяти (хотя в самой либе может быть гадость вроде if(fail){exit(-1);}, с чем уже работать проблематично). В теории, можно для каждой платформы это обработать. Если сходу - как это можно реализовать для винды:
    На самом деле выносим работу с либой в отдельный поток. Когда она сделает что-то плохое (к примеру, попытается читать освобожденную память) будет выброшено SEH исключение, для которого мы можем зарегистрировать обработчик (using a vectored exception handler в msdn). В хендлере можно было бы проверить, что исключение выброшено именно из треда этой либы и если это действительно так - просто грохнуть этот тред. Но даже если сработает это крайне плохой метод - либа захватывает какие-то ресурсы и нет никакой гарантии, что она корректно их освободит при падении треда (да и что приложение вообще останется в согласованном состоянии - кто знает, почему она падает - может, там вообще половина памяти перед этим мусором перезаписывается). Короче, решение с потоком - это потенциально нестабильная работа всего приложения.
    Для изоляции памяти и использования ресурсов как раз и существуют процессы, как бы не хотелось от них уйти :)
    Так что решение с отдельным процессом, который будет изолировать все болячки либы и не давать им распространиться на все приложение таки самое безопасное.
    Ответ написан
  • Как сделать циклический сдвиг массива на 4 вправо?

    @menkar3
    std::rotate?
    #include <algorithm>
    ...
    int main()
    {
        const int n = 12;
        int a[n] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
        rotate(a, &a[n] - 4, &a[n]);
        for (auto n : a)
        {
            cout << n << " ";
        }
        return 0;
    }
    Ответ написан
  • Почему код не компилируется в Visual Studio 2019?

    @menkar3
    Потому что точка входа в приложение задается в студии настройках проекта, а вы, как я понимаю, создали дефолтный=)
    Первая ссылка в гугле: https://stackoverflow.com/questions/18067870/what-...
    Оф. документация - https://docs.microsoft.com/en-us/cpp/build/referen...
    Вкратце:
    5e4c3eb70af5d542955543.png
    Ответ написан