1. Куча / Говнокод #21914

    −70

    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
    ВЫНЕСЕНИЕ ИНВАРИАНТНОГО КОДА ЗА ПРЕДЕЛЫ ЦИКЛА
    
    Инвариантным называется код, не изменяющийся в ходе выполнения цикла. А раз так, – 
    то какой смысл выполнять его в каждой итерации – не лучше ли вынести такой код за пределы цикла?
    Рассмотрим следующий пример:
    
    for(a = 0;a  <(b*2);  a++)
    
    printf("%x\n",a*(b/2));
    
    Выражения (b*2) и (b/2) очевидно представляют собой инвариант, и оптимизированный код будет выглядеть так:
    
    tmp_1=b*2;
    
    tmp_2=b/2;
    
    for(a=0;a<tmp_1;a++)
    
    printf("%x\n",tmp_2+=tmp_2);
    
    Это экономит одну операцию деления и две операции умножения на каждую итерацию, что очень и очень неплохо!
    Компиляторы Microsoft Visual C++ и WATCOM успешно распознают инвариантный код и выносят его за пределы цикла, 
    а вот Borland C++ увы, нет.

    Всегда было интересно узнать кто-нибудь чему-нибудь научился на книжках KPNC ?

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

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

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