例のinline展開絡みの話

長くなったのでこっちに。ちょっとコメントに書こうと思ったので珍しく言葉遣いが丁寧になってますが。

まず、ACM/ICPCやPKU JudgeOnline(以下PKU)などで、vector >と言ったネストしたvector、それだけに止まらず、STLを使うと異常な程遅くなるという現象の原因を調べる、と言った目的で今回の検証を書きました。どうせinline展開周りだろうとは思っていたのですが、今後のために具体的にどういう状況でinline展開されないのか確認する必要があった感じです。後もう一つ書き忘れましたが、最初のinc1, inc2はメンバ関数ではなく普通の関数です。

話を戻して、PKUなどではvector >を静的なn次元配列にするだけでTLE(規定時間オーバーによる失格)が解消されてしまう、STLではないですが入力をcinからscanfに変えるだけで数百倍速くなるなど、STLやその他のtemplate classからなるC++の標準ライブラリを使うことによる恐ろしい速度低下が問題になることが「頻繁に」あります。ICPCアジア予選やその他のプログラミングコンテストでもたまに問題になります。「g++では-O1を付けたときに、template classのメンバ関数がinline展開されない」というのはここに大きく影響してきます。

あと「仕様なのかバグなのか」っていうのは完全に俺の書き方が悪かったですw 正しくは、「意図的にinline展開していないのか、したかったんだけどされてないことに気付いてないのか」です。といっても、コンパイラを作る人が決めることなので文句は言えないし、言うつもりもなく(言ってますがw)、実際に-O2にすれば解決してしまう些細な問題です。問題は現実的に様々なプログラミングコンテストで、そう言うことを把握しているのかどうか分かりませんが、-O1が用いられていると言うことです。

何が問題なのかというと、本来言語の機能をフル活用して、洗練されたアルゴリズムを書くことで競われるはずのプログラミングコンテストで、言語の機能が制限されているという事です。俺はboostやSTLはinline展開されることを前提に書かれていると信じていますし、C++も安全かつ柔軟に高速なコードが書けるようにinlineというキーワードを持っているのだと思っています。その機能を部分的に殺されたC++を使っていると、先ほどのようにvector使えば良い場所を静的配列に置き換えたりと、「無駄な」作業が生じます。しかし、そのオプションでやるのが大会のルールですので仕方ないと言えば仕方ありません。でも馬鹿らしいと思います。界王拳を使った状態のC++に戦わせてやりたいです。解ける問題が一気に増えるわけでもないので、気持ちよくプログラムを書くためにも-O2を付けて貰いたいところです。

とりあえずそんな感じです。