Что означает оптимизация компилятора «постоянное распространение»? - PullRequest
5 голосов
/ 08 февраля 2011

Из Effective C ++ Скотта Мейерса:

template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {

public:

    SquareMatrix( ) 
     : SquareMatrixBase<T>(n, 0), 
       pData(new T[n*n]) 
    {
         this->setDataPtr(pData.get()); 
    } 

        ...
private:

    boost::scoped_array<T> pData;
};

Независимо от того, где хранятся данные, ключевой результат с точки зрения раздувания состоит в том, что теперь многие - возможно, все - члены SquareMatrixфункции могут быть простыми встроенными вызовами версий базового класса, которые совместно используются всеми другими матрицами, содержащими данные того же типа, независимо от их размера.В то же время объекты SquareMatrix разных размеров являются разными типами, поэтому даже если, например, SquareMatrixи SquareMatrixобъекты используют одинаковые функции-члены в SquareMatrixBase , нет возможности передать SquareMatrixобъект функции, ожидающей SquareMatrix,Хорошо, нет?

Хорошо, да, но не бесплатно.Версии invert с встроенными в них размерами матриц, вероятно, будут генерировать лучший код, чем разделяемая версия, где размер передается в качестве параметра функции или сохраняется в объекте.Например, в версиях, зависящих от размера, размеры будут константами времени компиляции, следовательно, могут применяться для таких оптимизаций, как постоянное распространение, включая их включение в сгенерированные инструкции в качестве непосредственных операндов.Это не может быть сделано в версии, не зависящей от размера.

В вышеприведенном описании в последнем абзаце это упоминалось как «следовательно, имеет право на такие оптимизации как постоянное распространение, включая ихскладывается в сгенерированные инструкции как непосредственные операнды ".Что означает этот устав?Просьба объяснить это.

Спасибо!

Ответы [ 2 ]

10 голосов
/ 08 февраля 2011

Constant Propagation - очень простая (в принципе) оптимизация, оставляемая компиляторам.

size_t radius = 5;
size_t diameter = 2*radius;
float perimeter = diameter * 3.1416f;

Это будет уменьшено компилятором путем распространения констант:

  • примечаниечто значение radius известно
  • выполнить вычисление 2*radius (это постоянное свертывание)
  • поэтому значение diameter известно
  • выполнитьвычисление diameter * 3.1416f
  • поэтому значение perimeter известно

Программа, таким образом, эквивалентна:

size_t radius = 5;
size_t diameter = 10;
float perimeter = 31.416f;

Обратите внимание, что естьмногие другие формы оптимизации, например, если radius и diameter больше не нужны, мы можем удалить их и оставить только perimeter.

0 голосов
/ 31 мая 2015

если у вас есть оригинальный код, такой как:

a:=3;
b:=4;
b+=1;
b+=2;
a:=a+b;

, то операторы могут оптимизировать операторы как:

b==7;
a==10;

Это называется постоянным распространением и постоянным сворачиванием.

...