0

関数属性は、関数宣言に対してのみ指定できます (定義ではありません)。そのため、ネストされた関数の属性を指定できません。例えば:

//invalid line. hot_nested_function is invisible outside "some_function"
void hot_nested_function() __attribute__ ((hot));

//valid attribute for declaration
int some_function() __attribute__ ((hot));

int some_function(){
    void hot_nested_function(){
         //time critical code
    }
    for( int i=0; i<REPEAT_MANY_TIMES;i++)
        hot_nested_function();
}

このような場合、「hot_nested_function」は「hot」として最適化されますか?

UPD:ばかげた例では、gcc (手段およびより高い最適化レベル) は、 (ネストされた関数の場合) のgcc -O1有無にかかわらず、関数呼び出しをその本体に置き換えます。__attribute__ ((hot))ネストされた関数について思い出させるものは何もありません。

UPD2: gcc.git/gcc/tree-nested.cによると、親関数の参照、外部ラベルのジャンプなどを解決します。次の段階で、ネストされた関数は、インライン化機能を備えた独立した関数に変換されます。しかし、親関数の属性についてはまだ不明です。彼らは入れ子に適用しましたか?

4

1 に答える 1

1
int some_function(){
    void __attribute__ ((hot)) hot_nested_function(){
         //time critical code
    }
    for( int i=0; i<REPEAT_MANY_TIMES;i++)
        hot_nested_function();
}

gcc の関数属性構文は、

__attribute__ ((...)) returntype functionname(...)
returntype __attribute__ ((...)) functionname(...)
returntype functionname(...) __attribute__ ((...))

最後の 1 つはプロトタイプでのみ使用できましたが、最初の 2 つは使用できませんでした。

別の方法は

int some_function(){
    auto void hot_nested_function() __attribute__ ((hot));

    void hot_nested_function(){
         //time critical code
    }

    for( int i=0; i<REPEAT_MANY_TIMES;i++)
        hot_nested_function();
}

含まれているすべてのオブジェクトに自動的に適用される属性については、私にはわかりません。また、ドキュメントには何も記載されていないため、決定するのはコンパイラ次第です。手動で指定することをお勧めします。コンパイラのバージョン間で動作が異なる場合があります。

于 2014-03-12T10:23:09.887 に答える