Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Оптимизация и статические функции

#cpp #оптимизация


Вопрос навеян следующим утверждением:


  7.14 Functions
  
  
    Make functions static It is recommended to add the keyword static to
    all non-member functions that are not needed outside the module in
    which they are defined. The static declaration restricts the scope of
    the function to the current module (i.e. the current .cpp file). This
    enables the compiler to optimize across function calls. You cannot use
    this optimization for class member functions, because the keyword
    static has a different meaning for member functions.
  


Источник

Как работает оптимизация для статических функций?
    


Ответы

Ответ 1



Идея процитированного совета базируется на том, что в месте вызова функции с внутренним связыванием компилятору всегда доступно определение этой функции. Поэтому, во-первых, компилятор всегда имеет возможность встроить вызов такой функции, если сочтет это необходимым. Во-вторых, независимо от того, встраивается функция или нет, имея доступ к определению функции, компилятор имеет полное представление о ее поведении (например, какие элементы переданного агрегата она модифицирует, а какие нет), что дает ему возможность лучше оптимизировать вызывающий код. static void foo(int a[]) { a[5] = 5; a[rand() + 1] = rand(); } void bar() { int a[100] = { 42 }; foo(a); // Здесь компилятор знает, что `a[0]` по-прежнему `42` } В-третьих, компилятор имеет полное представление о всех контекстах вызова такой функции и может оптимизировать код функции с учетом особенностей этих контекстов. (При условии, что такая функция не является доступной снаружи косвенными средствами, т.е. через указатели) static void foo(int a, int b) { // Здесь компилятор знает, что `a` всегда четно, // а `b` не превосходит `3` } ... foo(i * 2, 2); ... foo(j * 4, 3); ... // Других вызовов `foo` нет

Комментариев нет:

Отправить комментарий