関数属性は、関数宣言に対してのみ指定できます (定義ではありません)。そのため、ネストされた関数の属性を指定できません。例えば:
//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によると、親関数の参照、外部ラベルのジャンプなどを解決します。次の段階で、ネストされた関数は、インライン化機能を備えた独立した関数に変換されます。しかし、親関数の属性についてはまだ不明です。彼らは入れ子に適用しましたか?