- PR -

C#でVC++作成DLLの参照渡し

投稿者投稿内容
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-02 12:24
引用:

テストコードを実行してみると予想に反して、
スレッドから、ちゃんと構造体メンバーに値をセットすることができてしまいました!(なぜでしょう?)



このコードだと、構造体は「常に同じ位置」にあるからじゃないすか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-11-02 16:33
引用:

テストコードを実行してみると予想に反して、
スレッドから、ちゃんと構造体メンバーに値をセットすることができてしまいました!(なぜでしょう?)


渋木さんも示唆してらっしゃいますが、ローカルの構造体はスタックに取られるのでGCによるオブジェクトの移動がないためですね。
各構造体をフィールドに置くようにすると破綻しますし、メソッドを抜けてもアドレスが無効になるので別メソッドで受けることもできません。
同じメソッド内で値を受け取るってのはわざわざ非同期である関数の利点をほぼ完全に殺すことになるでしょう。

//あいや、関数呼び出しそのものを別スレッドでやることにすればそれはそれで有りか……?
//スレッドが二重になっちゃうけど。
//まあ、アンマネージドの返し方・通知方法次第かな。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-11-02 17:01
こんにちは。

引用:

渋木宏明(ひどり)さんの書き込み (2005-11-02 12:24) より:
このコードだと、構造体は「常に同じ位置」にあるからじゃないすか?



たしかに「常に同じ位置」にあるから値がセットできているんですよね(~_~;)
「常に同じ位置」にあるのは、コードが悪いんですね!?
Hongliangさんのご指摘にあるようにスタックに割り当てられているからでしょうか?
う〜ん、このへん素人なので難しい;

引用:

Hongliangさんの書き込み (2005-11-02 16:33) より:

渋木さんも示唆してらっしゃいますが、ローカルの構造体はスタックに取られるのでGCによるオブジェクトの移動がないためですね。
各構造体をフィールドに置くようにすると破綻しますし、メソッドを抜けてもアドレスが無効になるので別メソッドで受けることもできません。



構造体をフィールドに置いたり、ゴミをつくってはGC.Collect()でゴミ集めをしてみたりしているのですが、
いざ「破綻」させようと頑張ってみても、思い通りに「破綻」してくれないですね〜(~_~;)
私がよく理解していないからでしょうが…

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-03 02:51
引用:

「常に同じ位置」にあるのは、コードが悪いんですね!?



「悪い」訳ではないです。
(障害を再現できないという意味では不適切ですが。。。)

引用:

Hongliangさんのご指摘にあるようにスタックに割り当てられているからでしょうか?
う〜ん、このへん素人なので難しい;



例によって MSDN Library のどこかで説明されていたはずです。
.NET なので日本語です。

引用:

構造体をフィールドに置いたり、ゴミをつくってはGC.Collect()でゴミ集めをしてみたりしているのですが、
いざ「破綻」させようと頑張ってみても、思い通りに「破綻」してくれないですね〜(~_~



GC.Collect() しても、移動の必要の無いオブジェクトまで動かしたりはしないでしょうからねぇ。

ArrayList list = new ArrayList();
for (int i = 0; i < 1024; i++) list.Add (new byte [16 * 1024];

とでもした後に、件の構造体をメンバに持ったクラスを new して

list.Clear();
GC.Collect();

すれば、「移動」が起きるカモ。

スキルアップ/キャリアアップ(JOB@IT)