Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
前々から疑問だったのですが
C/C++で組んでいて、前から疑問だったことがあります。
関数内でmallocなりnewなりで配列を確保し、それをreturnで返すようなものを実装したとします。まぁベクトルの演算を実装する場合なんかが挙げられるでしょうか。具体的には

double* Plus(double* a, double*b, length)
{
double* dst = new double[length];
for(int i=0; i<length; i++)
dst[i] = a[i] + b[i];
return dst;
}

みたいな関数ですね(ホワイトスペースってHTMLでどう書くか忘れた・・・)。こう定義すると、

double* c;
c = Plus(a, b, length);

みたいな書き方ができて多少分かりやすいかなと。関数内で領域を確保するのではなく、予め用意したバッファを引数に与えて実装するという手ももちろんありますが、見た目にどれが結果を格納するバッファか分かりにくいよな、と思っちゃうんですよね。実装するならこんな感じ?

void Plus(double* a, double* b, double* dst, length)
{
for(int i=0; i<length; i++)
dst[i] = a[i] + b[i];
}

見た目だけの問題で実際の処理量や確保するメモリ量に大差はないってのは分かってるんです。ただ、前者の例だと、d=a+b+cみたいな演算をするときに

d = Plus(a, Plus(b, c, length), length);

という書き方が可能です。後者の書き方だと、b+cの結果を一旦保持した上でそれとaの結果を加える必要があるため、変数が余計に必要となります。大した手間ではないと言われたらそれまでなんですが^^;

さて、前置きが長くなりましたが、本題はここからです。C/C++の場合、malloc/newした領域は使い終わったら必ずfree/deleteしましょうというのが作法です。自己責任ですが。ですので、こうした演算処理で確保した領域も用事が済んだら解放しなくてはなりません。

問題は

d = Plus(a, Plus(b, c, length), length);

と言った書き方をした場合の処理についてです。Plus(b, c, length)の結果は変数としてはどこにも格納されていませんから、先の「d = ~」を実行した後はそのアドレスへアクセスする手段がありません。ですので明示的にfree/deleteできません。
ならばこの処理を延々繰り返すとメモリリークをいずれ起こしちゃうんでしょうか?これが気になってるんですよねー。

JavaやC#のようなガベッジコレクションが用意されている言語なら気にしないのですが、C/C++ではどうなるんだろうと。それとも、メモリリークの原因になるからこういう実装はするなということなのでしょうか? それならそうで、仕方ないので諦めるんですが・・・。

MATLABとかOctaveってどうやって実装してるんだろうなー。あの柔軟な言語体系をどうやってC++で実装してるのか気になる・・・。

あぁ、Octaveはオープンソースだからソースコード手にはいるのか。いやさすがに見る根性ないけれど^^;

ま、当面は少々一時変数が増えようとも確実に自身でfree/deleteできるような実装にしとくべきだろうなぁ。

どういうキーワードで探したらヒントになる実装見つかるかしら?
関連記事
スポンサーサイト



コメント
この記事へのコメント
>ホワイトスペースってHTMLでどう書くか
多分全角スペースで良い。

2007/08/27(Mon) 10:49 | URL  | Velnir #YG9ONXHE[ 編集]
あぁなるほど
ただ、確かなんかあったはずなんだよな。
まぁいいか。HTML直打ちなんて滅多にしないから忘れちまったよw
2007/08/27(Mon) 20:24 | URL  | code_air_edge #FvKBa17U[ 編集]
Velnir君、彼は技巧的にスペースを入れたいんだよきっと(爆)

そんなこで君に。span か div タグに
style="padding-left: ??px;"
をかませば(表示の上では)インデントもお手の物。span は使ったことないけども。
最近はhtmlを直打ちする機会も少ないだろうなぁ(僕はしょっちゅうだけどw)
2007/08/28(Tue) 00:05 | URL  | しー #cBGzM2ew[ 編集]
私のBlogではSPANタグは鬼のように蔓延っておりますよ(笑)>しーさん
DIVよりもレイアウトを崩さずにCSSが使えるのでお気に入りです.

さて,code氏,肝心のホワイトスペースは,「&nbsp;」と打てば入力可能です.特殊記号系は全部&~の形で用意されてるんで.でも,これだと明らかに入力が面倒なのでインデント程度なら全角スペースか<PRE></PRE>タグで回避する場合が多いですね.
2007/08/28(Tue) 02:31 | URL  | Velnir #YG9ONXHE[ 編集]
技巧的にと言うか
うろ覚えだったんですよねぇ。less than、grater thanなら分かりやすいですけど、ホワイトスペースは分かりにくいですよ^^;
ましてやHTMLを直打ちしない人間にCSSとか無茶すぎますよしーさんw
えぇ、そうですね。私はHTMLを直で打つのが嫌でBlogやWikiに逃げて居るんですからw

>Velnir
あぁ、nbspか!nbだと思って打ち込んだけど変化しなかったんだよな・・・。惜しかったのな。
おう、ちゃんと&~のルールは覚えているさ。実際使ってるしね。ただ、ホワイトスペースまでは覚えてなかった。こじつけて覚えられないモノは苦手だ。

PREタグで回避できたっけ? あれでもホワイトスペースは無視されたような・・・
まぁいい。今度使ってみよう。

お二方とも、thx。
2007/08/28(Tue) 21:51 | URL  | code_air_edge #FvKBa17U[ 編集]
コメントを投稿
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック