c/c++

ダンプを読めば世界がみえる

dlmallocを読み下し中。 何をしているかは大体解った。 メモリブロックに対して何かを行おうとするプログラムを読み解くとき、 メモリダンプを眺めるということが、 非常に有効だと思った。 プログラムの、メモリの海を見るために必要なのはやはりメモリダン…

C++でinheritedキーワードを使う

嘘嘘、inheritedキーワードなんてないよ。 ただ、C++に入りそうで入らなかったinheritedキーワードは実在する。 inheritedキーワードというのは、 Javaのsuperみたいなもの。これに関したバグがこないだあったので、考慮しないととか感じたり。 例えば、継承…

Modernへの架け橋

多くの人が書いていそうですが、 C++テンプレートテクニックは、Modern(Modern C++ Design)への架け橋だと感じました。今まで、C++に関するテンプレートの本として、 STLを使いこなすための本や、Boostを使うための本などはあっても、 「テンプレートの技…

俺はこの本を楽しみにしていましたよ

きじねこの高木さんの本です。 http://www.kijineko.co.jp/node/444 組込み現場の「C++」プログラミング 明日から使える徹底入門作者: 高木信尚出版社/メーカー: 技術評論社発売日: 2009/03/23メディア: 単行本購入: 3人 クリック: 16回この商品を含むブログ…

配列クラス、capacityが限界のときにpush_backしたらどうするのが正しい?

本当にあった話。 「配列にpush_backしたい」というのは意外と望まれる動作のようだ。 std::vectorでいいじゃん、と思うかもしれないが、vectorじゃ嫌だ、vectotは使えない!!という人がいる。 何故かといえば、vectorはpush_backしてcapacity不足だとアロ…

組込環境でC++を使う際の幾つかの優れた方法

組込環境というのは、メモリが数MBしかなくて(例えば4MB) プログラムのブートサイズにも限界がある環境の事です。 例外をコンパイラオプションでoffにする 「例外を使った方が安全です!!」 という言葉をはねのけて必ず「コンパイラのオプションで」offに…

C++で配列を速くするたった一つの方法

配列を捨てboost::arrayにしてiteratorを使う。 それだけ。 配列よりarrayが速いだと? と思うかもしれないですが、 サイズのでかい配列を走査しているときなどに効くので是非使ってあげてください。 (最適化は必要です)

最近のコンパイラではvectorのiteratorはポインタで実装されていない?

追記: - どうも誤解(こちらの誤読)だった様子。 恐らく多くの実装のiteratorは型としてはiteratorだが、実装上はポインタで成されているため、 最適化の恩恵を受けるとそれはポインタ演算をしていることと等価になる。 要するに、 ++itは、アドレスをイン…

std::vectorはそんなにダメか?

いま、メインでstd::vectorを使っているんですけれども、 「vectorってclearでメモリが解放されないんですよ!!!!」 という話を聴いた。 「シーンを遷移したらメモリの使用量が増えていたのでメモリリークしていると思ったらvectorがpush_backでメモリを…

可能ならば常にiteratorを使おう

だって、速いから。配列なんかよりずっとね。 特にstd::vectorのiteratorや、boost::arrrayのiteratorね! (追記:id:faith_and_brave さんの指摘でbeginやendが「実装上」ポインタになるということを追記しました) ……と、C++漬けの日々ですがSTLもBoostも…

びるど

ビルド時間が延びたり、 リンクが長くなってくると 「なんとかしなきゃ」と思うのが「しーぷらぷらー」。

C++はひどい言語だ

STLは実装依存*1だし、 Boostだってうぎゃああああ、 RTTI? exception? そんなものまともに動くのかい? boostをincludeしたらRTTIがdisableで怒られる! exceptionがdisableで怒られる! ああああああ、.textはもう一杯だ。 だって、templateで似たような…

つれづれ休みはどこモード

そういえば、最近Factoryを書いていて、 Factoryもすぐにreturnしたいよなあ、と思ったりした。 orz... そんなことより、 スタックサイズとかリンカとマップファイルとにらめっこしての メモリマッピングの方が大忙しなんだけれども。 (意外とマップファイ…

慣れないと

便利そうに見えて便利ではない小物クラスを書きがち。 これは便利だぜえええええ、と思っているクラスは意外と使えない。 Cの関数をただただラップしたりするとそういう感じになりがち。

同じ事をするのに複数のやり方を与えてはいけない

メモリ集めに余念がない日々ですよ、コンニチワ! さておき、1日かけて環境周りの整備。 整備できずにおいておいたところが酷い事になってた。 一つの事をするのに複数のやり方を提供していた(ないしはやり方を提供していなかった)のが原因。 このおかげ…

途中でreturn編 ちょっとりふぁくと

とりあえず、関係のないところでつっこまれたのでちょっとりふぁくと。 あー、やっぱり。予想通り「ながら」処理の典型的なのが出てきました。「ながら」処理というのは複数の事を一度に実行しようとする実装です。「ステータスを変更する必要があるかどうか…

常識的に考えてネストしすぎだお前

int Hoge::hoge() { if (initialized_) { int min = 100000; for (int x = 0; x < width_; ++x) { for (int y = 0; y < height+; ++y) { if (items_[x][y].flag & ENABLE) { int length = items_[x][y]; if (length < min) { min = length; } } } } return m…

途中でreturnしたっていいじゃない、人間だもの

bool Person::action() { if (isStand()) { fsm_.change(&standState_); return true; } if (isMove()) { fsm_.change(&moveState_); return true; } return false; } これを、 bool Person::action() { bool result = false; if (isStand()) { fsm_.change(…

newしたらスタックかレジスタを探る

newした位置が解るnew が以外と人気ですが、 泥臭くない方法で(寧ろハイパー泥臭い方法で)、 newの中で自分を呼び出した関数のアドレスをスタックかレジスタから引っ張ってきて、 それを保持しておく、というワザもあります。 ポータビリティは最低ですが…

途中でreturnしたいんだワン

ということで、簡単なステートマシンを書いてみた。 書き殴りではあるが、 http://codepad.org/8wkH7y5G で、この中でこんなコードを書いた。 bool Person::action() { if (isStand()) { fsm_.change(&standState_); return true; } if (isMove()) { fsm_.ch…

メンバ関数ポインタは悪だろうか?

Cの関数ポインタに疲れていると、関数ポインタはまるで悪のような気がしてくるのだけれど、 では、メンバ関数ポインタは悪だろうか、というような事。 STLなどで指定する場合は置いておいて、自分で呼び出す場合、 「仮想関数でいいじゃん?」 ってなことが…

newした位置が解るnew

が欲しい。 といつも思っているんだけれど、 なかなかそうはいかないのよね、というお話。デバッグ用のメモリ確保ルーチンなどには、 そのメモリブロックが何の用途で使われているのかヘッダに記憶しておいたりする。 要するに、 new (__LINE__, __FILE__) H…

Cだけプログラマの憂鬱

それ、C関係ないのでは - プログラミング言語を作る日記 それC関係ないよね、というのはきむら(K)さんや、id:minekoaさんにも言われたことですが、 実行時のチェックがない。よって、配列のオーバーラン、不正なキャスト、開放されたメモリを参照する、とい…

makeは続くよどこまでも

make最高だぜ、と叫びたくなるくらいにはmakeが(下手の横)好きで、 今は、 makeのお家芸とも呼べる、再帰的makeを使っているんですが、 Entering directory ... Leaving directory の表記がWarningなんかを隠してしまうので、 とりあえず、 --no-print-dir…

静的よりも無名、グローバルインスタンスよりグローバル関数

最近、やっと意識していること。 static HogeManager hogeManager_; ではなく、 namespace { HogeManager hogeManager_; } とする。 HogeManagerは静的でありたいわけではなく、 ファイル内アクセスをしたいだけに過ぎないから正当な機能である無名名前空間…

C++ Coding Standardsはどう述べているか、という蛇足

egtraさん曰く。(コメント欄 これに限らずデストラクタが非virtualな多態的に使うつもりはない基底クラスはコンストラクタ・デストラクタをprotectedにするのがよい(そしてunary_functionもそうすべきだった)ということは確かC++ Coding Standardsに書い…

Java脳の恐怖とC++

Javaは良い言語であった。*1 登場時のJavaは WORA(Write once, run anywhere)を体現しWeb向け言語としてもプログラマ達に夢を見せた。 今見てしまえば冗長で可読性の低いC系構文に 糞のようなクラス構文とゲロのようなインターフェイス構文であるが それで…

関数オブジェクトの存在意義

まあそれにvirtualデストラクタがないから危険が危ない。 ... 書いてて思ったのは、おそらくfunctorをポリモルフィックにしようとすると、結局ポインタ経由で使いたくなって、そうすると関数ぽく呼び出すときにデリファレンスしてやらなきゃいけなくなる。で…

ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない?

ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない C++では基底クラスにvirtualデストラクタを書こう - *「ふっかつのじゅもんがちがいます。」withぬこ はよくある間違い。あるいはC++初心者の勘違い。 継承する可能…

C++に実行時の型なんてものはない

は嘘でした。k.inaba さんの指摘で修正。 と、まで書くと言い過ぎか?*1 また、オーバーロードされた演算子の動作を特別に考える必要もない。 演算子オーバーロードした演算子はメンバ関数と同じ動きをする。 virtualでない演算子は、演算子を呼び出した対象…