1. C++ / Говнокод #21877

    −15

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    void MeasureWorker::measure()
    {
        QVector< QVector<double> > *S12_AmplitudeCurveArray = new QVector< QVector<double> >;
        QVector<double> *S11_Amplitudes = new QVector<double>;
        mutex = new QMutex();
    
        if (!running) {
           return;
        }
    
        switch(mode) {
            case AUTO_MODE: {
                if (type == SofNum) {
                    if (!readSofNum()) {
                        if (deviceProblem) {
                            closeDevices();
                            stop();
                        }
                    }
                }
                if (type == SofFreq) {
                    if (!readSofFreq(S12_AmplitudeCurveArray, S11_Amplitudes)) {
                        if (deviceProblem) {
                            closeDevices();
                            stop();
                        }
                    }
                }
    
    // Дальше пока что неинтересно...
    
    bool MeasureWorker::readSofFreq(QVector<QVector<double> > *S12_AmplitudeCurveArray,
                                    QVector<double> *S11_AmplitudeCurve)
    {
        if (selectedChannel.CH1) {
            if (!oneReadSofFreq(S11_AmplitudeCurve,
                                S12_AmplitudeCurveArray, 1)) {
                return false;
            }
        } else {
            mutex->lock();
            S12_AmplitudeCurveArray->append(QVector<double>(NP51, 0.0));
            try {
                r4m->setSweepParams(START, STOP, NP51);
                r4m->startSweep();
                QVector<ComplexType> freqS11 = r4m->getData("s22");
                if (freqS11.isEmpty()) {
                    throw std::invalid_argument("freqS11 is empty");
                }
                for(ComplexType complex : freqS11) {
                    S11_AmplitudeCurve->append(complex.toLogAmp());
                }
            } catch(std::exception &e) {
                r4m->error(e.what());
                deviceProblem = true;
                return false;
            }
            mutex->unlock();
            emit updateGraphS11f(S11_AmplitudeCurve);
            Sleep(TIME_SHIFT);
        }
    
    // ...

    - А если... дидлок?
    - Та похуй... там всёрно каждый раз новый мьютекс создается...

    Запостил: Antervis, 21 Декабря 2016

    Комментарии (32) RSS

    • lock (new Object()) { /*.]||||[.*/ }
      Ответить
    • > new
      Небось, с сишарпа пересели? Никогда не понимал, зачем выделять локальные переменные через new. Тупость же.
      Ответить
      • По-моему это с++ в стиле кутэ. В книжках и туториалах по кутэ все объекты создают в куче и даже delete потом не вызывают вроде.
        (Инфа старая, времен qt4.)
        Ответить
        • во-первых, только наследники от QObject'ов. Во-вторых, явно указывается родитель.
          Ответить
          • Ну ясен хуй, что указывается. Не хватало, чтобы на самом деле память не освобождали.
            Ответить
      • Еще я видел локальные переменные на куче в документации к хттп-парсеру из nodejs, так что возможно это общая проблема пыхеров и жаберов, которых волею судеб занесло в си - сложно выбрать между кучей и стеком.
        Ответить
        • API Design for C++, страница 156
          Here's an example of using the C++ API
          Stack *stack = new Stack();
          if (stack) {
              stack->Push(10);
              stack->Push(3);
              while (!stack->IsEmpty()) {
                  stack->Pop();
              }
              delete stack;
          }
          Хотя хоть в коде к книге, который можно загрузить с сайта, такого треша почему-то нет.
          Ответить
          • >>C++ API
            Но может быть они хотели показать операторы new и delete?
            Ответить
      • Стек-то не резиновый! Тем более они там целый массив выделяют, который в теории может быть большим.
        Ed: Хотя фиг знает, скорее всего этот QVector и сам по себе никогда на стек не попадает.
        Ответить
        • Доархитекторился, что забыл как вектор устроен.
          Ответить
          • > забыл как вектор устроен

            wvxvw тоже небось так и не знает, что не мешает ему писать простыни и обзывать всех вокруг дебилами
            http://govnokod.ru/9201#comment127950
            Ответить
          • в основном как std::vector из 03, но с implicit sharing.
            Ответить
        • Это шутка? QVector же в куче память под элементы выделяет. Априори размер у него должен быть примерно в три лонга.
          Ответить
          • > QVector же в куче память под элементы выделяет.
            Да дошло же уже, причём довольно быстро, см. Ed.
            Очень давно кресты не трогал, а в няшной локальные массивы вполне себе на стек попадают, сработал рефлекс.
            Ответить
      • не переносили. Писал студент после курса джавы.
        Ответить
        • > переносили
          >> с сишарпа пересели

          > после курса джавы
          Собственно, я почти угадал.
          Ответить
        • Джава хороший язык, но к сожалению имеет вот такой вот дурацкий сайдэффект. Люди начинают что в стеке можно хранить только инт, а структуру из двух интов надо в куче.

          И потому студентов джаве надо учить ПОСЛЕ сей, чтобы они сначала поняли что такое стек и куча, и как память работает, а не просто тупо копировали слово "new" как какую-то мантру
          Ответить
      • Когдя я после плюсов перелазил на жабу, у меня люто бомбило от того, что везде надо память выделять в куче
        Это я потом узнал про vm)
        Ответить
        • Vm?
          Ответить
          • виртаульная машина
            Ответить
            • То есть узнали что джава это вирт машина, а нк только яп?
              Ответить
              • нет конечно, я тогда еще не знал что вм достаточно умная и может оптимизировать всю эту хрень на лету
                Ответить
                • Как оптимизировать?
                  Ответить
                  • > Как оптимизировать?

                    Cоздавать объекты на стеке, а не в куче

                    The Java language does not offer any way to explicitly allocate an object on the stack, but this fact doesn't prevent JVMs from still using stack allocation where appropriate. JVMs can use a technique called escape analysis, by which they can tell that certain objects remain confined to a single thread for their entire lifetime, and that lifetime is bounded by the lifetime of a given stack frame. Such objects can be safely allocated on the stack instead of the heap. Even better, for small objects, the JVM can optimize away the allocation entirely and simply hoist the object's fields into registers.

                    -- http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html
                    Ответить
                    • иными словами если JVM может доказать что за пределы твоего блока ссыль на объект не выйдет, то он имеет полное право не ложить его в кучу, даже если ты явно напейсал new
                      Ответить
                    • а сколько жрет вм на то, чтобы проанализировать workflow всей программы?
                      Ответить
                      • > всей программы
                        А она разве умеет всю? Вроде анализ утечек у нее весьма тупой - только на одну функцию.
                        Ответить
        • Там же куча другая. Аллокации дешевле вроде.
          Ответить
          • Дешевле, ибо не надо думать. Бери, да нарезай


            А потом расплатк в виде гц
            Ответить
            • > расплата
              Да в общем-то почти бесплатно, если объекты живут либо совсем мало либо очень долго. Дорого стоят только объекты, которые 2-3 сборки переживают и дохнут...
              Ответить
              • Ну да,потому что в минорный гц они не попадают, и провоцируют мажорный
                Ответить

    Добавить комментарий