C++のもやもや局面

こういうのってどうしているんだろうな。

その1

Cのテクニックで構造体の最後のメンバを ポインタ or 配列 にして、それを経由して配列のサイズ以上にアクセスするってやつがあるじゃないですか。
固定長ヘッダを持つ、可変長のデータ構造とか(他にもあるけど)。
そういうのを C++ のクラスを使っている場合に、「どうしようかな〜」と考えるのがもやもやしますね。
結局、おとなしくC++のクラスを使ってしまうのだけど、判断基準が不明確でもやもや。
基本は安全方面に。


例えば、今実装中のBignumとかもそうですね。
今の実装では、他のオブジェクトは即値以外はクラスなので選択肢は実はないのですが。

その2

ここはぜひインライン展開してほしいってときは inline にしますが、いつも心のどこかで本当に inline になるかな?
コンパイラがサボったり、inline 展開条件(コンパイラによって違う)に引っかかったりしないかな。
とか信用できない自分がいます。


これの疑心暗鬼のせいでいまだに、マクロに心惹かれるときがあります。(型とか関係なくなるのであまり使わないですが)

その3

定数の扱い。

const int HOGE = 3;

なのか

#define HOGE (3)

なのか

enum {
  HOGE = 3,
};

なのか。
さすがにマクロは最近は使わない。
そのクラスに特有の定数であれば、public な(無名 or 有名) enum とかにしてますが、どうなんだろう。
enum や const には(小さい)欠点があって、cpp で展開されないのですよね。
だからドライバとかを書いていて

outp8(MSR, HOGE | HUGA | HIGE);

が意図する引数になっているか実行してみないと分からない。(静的に決まるにもかかわらず)

その4

アクセサ。
言語処理系を作っていると、ほぼ構造体なのだけどクラスというクラスがあったりする。
で、メンバを protected にして毎回アクセサを定義するのか?と迷う。(絶対継承しないってなら private か)
もうね。public にして良いのではないかと。
特にデータ型のクラスだと、メンバが露出していた方がコードが書きやすいんだよなあ。
hoge->size = 3;
hoge->data;
しかも、基本データ型だから物凄い回数参照されるんですよ。
もしもアクセサが、インライン展開されなかったらと「その2」みたいな疑いも発生するし。

さて

もやもやを書いて出力すればどうにかなると思ったがそうでもなかった。
自分が完全にコントロールできるコードならいいのだけどオープンソースだからそうもいかないよな。
C++ やめれ。という声が聴こえる。
でもC++Scheme処理系書きたいんですよ。
生Cよりは楽だし。

追記

Effective ほげほげはもちろん読んだのですが、実際の現場はどうなのだろうな。
そういえば、C++をメインで仕事したことないな。

追記2

偉い人が降りてきて、言語処理系やOSなどの特別な局面ではそのあたりはフレキシブルだよ。
とか言ってくれないだろうか。