- - PR -
C#でVC++作成DLLの参照渡し
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-02 12:24
このコードだと、構造体は「常に同じ位置」にあるからじゃないすか? | ||||||||||||
|
投稿日時: 2005-11-02 16:33
渋木さんも示唆してらっしゃいますが、ローカルの構造体はスタックに取られるのでGCによるオブジェクトの移動がないためですね。 各構造体をフィールドに置くようにすると破綻しますし、メソッドを抜けてもアドレスが無効になるので別メソッドで受けることもできません。 同じメソッド内で値を受け取るってのはわざわざ非同期である関数の利点をほぼ完全に殺すことになるでしょう。 //あいや、関数呼び出しそのものを別スレッドでやることにすればそれはそれで有りか……? //スレッドが二重になっちゃうけど。 //まあ、アンマネージドの返し方・通知方法次第かな。 | ||||||||||||
|
投稿日時: 2005-11-02 17:01
こんにちは。
たしかに「常に同じ位置」にあるから値がセットできているんですよね(~_~;) 「常に同じ位置」にあるのは、コードが悪いんですね!? Hongliangさんのご指摘にあるようにスタックに割り当てられているからでしょうか? う〜ん、このへん素人なので難しい;
構造体をフィールドに置いたり、ゴミをつくってはGC.Collect()でゴミ集めをしてみたりしているのですが、 いざ「破綻」させようと頑張ってみても、思い通りに「破綻」してくれないですね〜(~_~;) 私がよく理解していないからでしょうが… | ||||||||||||
|
投稿日時: 2005-11-03 02:51
「悪い」訳ではないです。 (障害を再現できないという意味では不適切ですが。。。)
例によって MSDN Library のどこかで説明されていたはずです。 .NET なので日本語です。
GC.Collect() しても、移動の必要の無いオブジェクトまで動かしたりはしないでしょうからねぇ。 ArrayList list = new ArrayList(); for (int i = 0; i < 1024; i++) list.Add (new byte [16 * 1024]; とでもした後に、件の構造体をメンバに持ったクラスを new して list.Clear(); GC.Collect(); すれば、「移動」が起きるカモ。 |