超バッドノウハウ
昨日今日のコメントの話題関連の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で大丈夫)ヒューリスティクスに基づく分岐推測がどうのとか書いてあったような。よくわからん。
何の役に立つかは知らんが。