超バッドノウハウ

昨日今日のコメントの話題関連のgccバッドノウハウを3個ほど。

  • gcc 2.95 では、ソースファイルからヘッダファイルが作れた
// ifout.c
int func()
{
	return 100;
}
/usr/local/gcc-2.95/bin/gcc -aux-info ifout.X --verbose ifout.c

こんなふうに-aux-infoオプションでファイルを指定すると、ifout.Xに、

/* compiled from: . */
/* ifout.c:2:OF */ extern int func (void); /* () */

こういうファイルができる。C++は未対応っぽい。

  • pragma interface
#pragma interface

class Nanika
{
	int x;
public:
	int getX() { return x; }
	int setX(int val) { x = val; }
};

これを、block.hとして、block.cppを

#pragma implementation "block.h"

この一行だけにしておくと、D言語ぐらいの気分になれる。


pragma interface をヘッダファイルに書いておくと、そのファイルをどれだけincludeしても実体は作られない。
pragma implementation したときだけ、実体が作られる。
参考

  • プロファイルをもとに最適化できる。

まず、コンパイルするときに、-fprofile-arcsオプションを付けてコンパイルする。んで、実行すると、"xxx.da"という、拡張子".da"のファイルができる。これがプロファイル結果。
で、次にコンパイルするときに、-fbranch-probabilitiesオプションを付けると、そのプロファイル結果を利用してくれる。
このプロファイル結果はGCCに付いてくるgcovプログラムを使えば見れる。コンパイルするときに、-fprofile-arcsと-ftest-coverageを付ける。で、実行したあと、gcov xxx.c とかすれば、どの行を何回実行したか見れる。
どのくらい効果があるかは調べてない。プロファイルが無くても、-fguess-branch-probabilityを付けておけば(-Oで大丈夫)ヒューリスティクスに基づく分岐推測がどうのとか書いてあったような。よくわからん。




何の役に立つかは知らんが。