Что особенного в gcc в цикле, который повторяется 999 раз?

Из статьи Добавление вспомогательных отчетов, поиск итоговых сумм и общее количество (в основной отчет) :

Crystal Reports - это приложение для бизнес-аналитики, используемое для проектирования и генерировать отчеты из широкого спектра источников данных. Sub Reports - это дочерние отчеты основного отчета, которые могут быть встроены в основной отчет. Суб-отчеты очень полезны для составления отчетов.

Добавление вспомогательных отчетов находит общую и общую сумму каждого дополнительного отчета в основном отчете

Основной отчет

Sub Report 1

Sub Total: sum (LabTotal)

Sub Report 2

Sub Total: sum (ItemTotal)

Grand Всего

Под-отчеты являются очень полезной опцией в отчете о кристаллах. Предположим, мы хотим найти

Добавление отчета Crystal

  1. Добавить новый элемент-> Отчет Crystal
  2. Если мы хотим создать Crystal Report, выберите наш собственный формат «Как пустой отчет» из галереи Crystal report
  3. Щелкните правой кнопкой мыши по «полям базы данных» в полях базы данных и выберите таблицы из базы данных, затем создайте ссылки (если необходимо)
  4. вправо Нажмите «Подробности» и добавьте дополнительный отчет.
  5. Повторите то же самое, что мы сделали в основном отчете, и перетащите необходимые поля в дополнительный подраздел отчета детали

Например: мы создаем отчет о труде, общий объем рабочей силы можно рассчитать как

В поле формулы - имя LabTotal

WhilePrintingRecords; Shared NumberVar LabTotal: = Sum ({PC_LABOUR_DETAILS.Total})

({PC_LABOUR_DETAILS) - таблица Total --- field

и добавлена ​​сумма LabTotal в поле подгонки

Если у нас есть еще один дополнительный отчет, чтобы добавить ион на главную страницу, снова щелкните правой кнопкой мыши на разделе «Подробности» и добавьте новый раздел -> Подробности (b) И повторите шаги 4 и 5. Здесь мы добавляем второй суб-отчет по материалу и субтоталю материалов можно окупить как

В поле формулы -name ItemTotal

WhilePrintingRecords; Shared NumberVar ItemTotal: = Sum {PC_MATERIAL_DETAILS.Total})

({PC_MATERIAL_DETAILS) -table Total - поле

и добавляет сумму ItemTotal в поле sub total

Основной отчет

Чтобы найти общее количество обоих подписок

В поле Название формулы - GrandTotal

WhilePrintingRecords; Общий элемент NumberVar ItemTotal; Общий NumberVar LabTotal; NumberVar TotalAmount; TotalAmount: = ItemTotal + LabTotal; TotalAmount

blockquote>

3
задан Peter de Rivaz 1 March 2019 в 22:08
поделиться

1 ответ

Это в основном результат произвольной постоянной в источниках GCC.

GCC имеет внутренний параметр, который контролирует, сколько раз цикл предварительно развернут во время оптимизации:

/* The maximum number of iterations of a loop the brute force algorithm
   for analysis of # of iterations of the loop tries to evaluate.  */
DEFPARAM(PARAM_MAX_ITERATIONS_TO_TRACK,
        "max-iterations-to-track",
        "Bound on the number of iterations the brute force #"
        " of iterations analysis algorithm evaluates.",
        1000, 0, 0)

Это используется для анализа циклов, если GCC не имеет специальной логики для выполнения какого-либо алгебраического преобразования. чтобы получить количество итераций.

Если вы измените этот параметр на другое значение, переключение с результата на другой произойдет при другом магическом значении. С вашим исходным значением 998 я получаю это:

$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=997 t.c | grep jl
    jl  .L3
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=998 t.c | grep jl
    jl  .L3
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=999 t.c | grep jl
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=1000 t.c | grep jl

Эти параметры являются внутренней деталью реализации и могут изменить значение в любое время или полностью исчезнуть.

(Используемая мной версия компилятора, основанная на GCC 6.3, не использует эти векторные инструкции для неоптимизированного случая, но представляет собой последовательность с условным переходом jl, и точка отсечки немного отличается, предположительно из-за другие оптимизации.)

0
ответ дан Florian Weimer 1 March 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: