今回あまり HPC ネタではありません。
新規開発で C でやる、ということもあまりなくなっているかもしれませんが、
C++ には何かをするための方法があまりに沢山あり、 STL も便利ですが記述
が極めて煩雑(C++11 で auto が導入されて改善はされてますがではそれまで
はなんだったんだみたいな)であるとかそういうわけで結構言語仕様がどんど
ん大きく変わるとか色々あって、長期にわたって継続的に(というか数年毎に
ちょっとづつ)いじるような開発にはあんまりどうかなというところがありま
す。
というわけで某プロジェクトのコードを十数年前に C++ ではなくて C で書い
たものをいまだに使い回しているわけですが、Cも昔に比べると随分便利になっ
てます。
-
構造体を返す関数とか構造体の代入とかできる(K&Rではできなかったの)
-
変数宣言がブロックの先頭でなくてもいい
-
配列サイズを変数にできる。関数の引数にもできる
要するに、使うとイライラしたところが随分ましになってます。
以下ちょっと技巧的かもしれませんが、例を。
速度はあまり問題ではないんだけど、ちょっと複雑なフラグによる処理をした
い、という状況、具体的な例としては、 flag が 0,1,2,3 の値を取り、それによって
変数 x に式 a, b, c, d のどれかをセットしたい、という状況を考えます。
ruby なら
x= [a,b,c,d][flag];
と書くところです。昔の C だと、switch 文を使って
switch(flag){
case 0: x=a; break;
case 1: x=b; break;
case 2: x=c; break;
case 3: x=d; break;
}
と書いたところでしょう。 break をいれるのを忘れるとか default (ここで
は使ってませんが)のスペルを間違えるとかで色々な楽しいことが起こります
し記述量も多くなってます。これが、今どきの C だと (x 等が double だと
して)以下のように書けるようです。
double cases[]={a,b,c,d};
x = cases[flag];
ruby のように1行とはいきませんが、switch を使うのに比べるとはるかにま
しです。もちろん、性能的には色々問題があります。 a, b, c, d がそれぞれ
複雑な式とか関数であってもどちらも同じように動きますが、 switch は成り
たったところで break で switch 文が終わりますが、配列を作るとまず全部
の要素が評価されます。まあでも、性能が問題にならないところであれば使っ
てもいいのではないでしょうか?