2009-01-01から1年間の記事一覧

とりあえず、C++を遅いというCプログラマを使ってはいけなかったコトだけは解った

さあ、ここからどんどん暗黒面に突っ走りますよ!(つまりは愚痴です)長年Cだけやってきた人が大抵言うこと「C++は遅い」。 いや、「C++の書き方を知らないから遅いコードを書いたんじゃないの?」 「C++の事を知らないという不勉強さをC++という言語のせい…

std::vectorはダメだという人間に限ってstd::vectorより劣ったものしか書けない

なんとなく考えること。 「可変長配列」を使っていて、 std::vector(の動作)はダメ、とか自前で書いた方が良い、なんてことをいう人がいるんだけれど、 std::vector以上のものを書くことができるのか?そういうとき、その人は文句は言えるがstd::vectorよ…

突き進めればgotoは使わない機能になる

使ってはならないのは「goto」ではないgo to文は 有害であるみねこあさん経由。 自分なりの視点で書きます。 最近書いているプロジェクトは二十万行程度の規模ですが、 gotoは一度も出現しません。しかし、 ifやfor、while、switch、returnなどは惜しみなく…

2ヶ月も放置してた

最も忙しい時期ですが、なんとか蘇ります。

インターフェイスに全てのオブジェクトが行えないメンバ関数を追加していくときの違和感は異常

何を抽象化しようとして、 例えば、 非仮想関数を束ねて、例えば、 図形の ObjectSphere や ObjectBox、 はたまた、ObjectRenderXXXX なんかを統合して、 ObjectShapeとして、 メソッドにvirtualを付けて メソッドをインターフェイスに公開する時の違和感は…

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

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

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

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

DebugHacks買ってしまった

BinaryHacksがあまりに素晴らしかったので買ってしまいました。/(^o^)\ id:Isoparametricさんと同じくBinary Hacksで気を紛らわせていた俺には超朗報!こういうTシャツとか勉強会に着て行きたいよね!!Valgrindウマーということで応募!!! DebugHacks&Tシ…

Modernへの架け橋

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

基本装備と心得の本

プロダクティブ・プログラマ -プログラマのための生産性向上術 (THEORY/IN/PRACTICE)作者: Neal Ford,島田浩二(監訳),夏目大出版社/メーカー: オライリージャパン発売日: 2009/04/27メディア: 単行本(ソフトカバー)購入: 14人 クリック: 218回この商品を含…

スタックとヒープは同一?

密やかな違和感。 「ヒープ領域」「スタック領域」といっても結局、物理メモリ上の領域をVM側等で扱いやすいように役割毎に分割してそう呼んでいるだけ、結局は同じ物理メモリ上。 我々が日々目にする(あるいは構築する)アプリケーションで「ヒープ領域」「…

インターフェイスについて深く考えたり、定量化を考えたりする

ために、この2つの本を読むべき。 誰のためのデザイン?―認知科学者のデザイン原論 (新曜社認知科学選書)作者: ドナルド・A.ノーマン,D.A.ノーマン,野島久雄出版社/メーカー: 新曜社発売日: 1990/02メディア: 単行本購入: 29人 クリック: 807回この商品を含…

世の中がDebugHacksと言っているのに

あえて、BinaryHacksを読んだ。 おもしれええええええええええええええ。 Binary Hacks ―ハッカー秘伝のテクニック100選作者: 高林哲,鵜飼文敏,佐藤祐介,浜地慎一郎,首藤一幸出版社/メーカー: オライリー・ジャパン発売日: 2006/11/14メディア: 単行本(ソフ…

勉強会やりたいよー

で、最後にデザインパターンの存在自体を紹介して、もっと勉強したけれは オライリーの HeadFirstデザインパターン で独習してね、と生徒に丸投げして終了です。(手抜きだなぁ) 我が家のOOPの研修 - みねこあ みねこあさんのこの勉強会に憧れを抱きます。 …

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

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

リスコフの置換原則違反のような

ちょいと気になったので。 ActionScriptは全く知りません。すびばせん。 たとえば ActionScript の Loader なんかが良い例です。 Loader は DisplayObjectContainer を継承しているので表示ツリーを構成できるはずなのですが、これをやると例外が飛びます( …

配列クラス、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はCommitで、throwはReset?

うーん、 returnをすることもthrowをすることも、 実際には上位に対して何らかの状態を伝えるために戻る、ということをするわけで、 bool File::open(const char* path) { if (!FileSystemOpen(&handle_, path)) { return false; } ... }はダメで、 bool Fil…

loggingにはgotoを使いたいだろうか?

田辺さんからご指摘があったので。元のコード。 public function getSystemValue($key) { $this->getLogger()->log(LOG_DEBUG, 'start'); // すでに読み込み済みデータの場合はそのデータを使用 $value = $this->findCache($key); if (!is_null($value)) { g…

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

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