#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` нет
Комментариев нет:
Отправить комментарий