C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: C#のガーベッジコレクションの


(過去ログ 118 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■69113 / inTopicNo.1)  C#のガーベッジコレクションの
  
□投稿者/ まくんわ (1回)-(2013/12/05(Thu) 09:23:39)

分類:[C#] 

早速ですけれども、
C#のガーベッジコレクション機能を停止させる事は可能でしょうか。
要は実行時間の安定性を図るために、極端に言えば、例えば、
非ローカルメモリを使う関数を全部C++で書いて、DLL化し、C#からコールします。
こんな場合でも C#のガーベッジコレクション機構はDLLの中で実装した関数が使用するメモルを管理したり、
勝手に解放したりするのでしょうか。

引用返信 編集キー/
■69114 / inTopicNo.2)  Re[1]: C#のガーベッジコレクションの
□投稿者/ オショウ (101回)-(2013/12/05(Thu) 09:28:28)
> C#のガーベッジコレクション機能を停止させる事は可能でしょうか。

  無いです。

> 要は実行時間の安定性を図るために、極端に言えば、例えば、

  実行時間って、一体、どの程度の時間単位で言っておられるのでしょうか?
  それによって、GCが問題ではなく別の原因の可能性もあります。

> 非ローカルメモリを使う関数を全部C++で書いて、DLL化し、C#からコールします。
> こんな場合でも C#のガーベッジコレクション機構はDLLの中で実装した関数が使用するメモルを管理したり、
> 勝手に解放したりするのでしょうか。

  アンマネージドで書けば影響は受けませんが・・・
  やりたいことが解らないので、適切な方法を提案できません。

以上。
引用返信 編集キー/
■69119 / inTopicNo.3)  Re[1]: C#のガーベッジコレクションの
□投稿者/ しま (49回)-(2013/12/05(Thu) 11:38:51)
No69113 (まくんわ さん) に返信
> 早速ですけれども、
> C#のガーベッジコレクション機能を停止させる事は可能でしょうか。
> 要は実行時間の安定性を図るために、極端に言えば、例えば、
> 非ローカルメモリを使う関数を全部C++で書いて、DLL化し、C#からコールします。
> こんな場合でも C#のガーベッジコレクション機構はDLLの中で実装した関数が使用するメモルを管理したり、
> 勝手に解放したりするのでしょうか。
>

いっそ、全部 C++ で書けばいいのにと思いました
何を心配しているのかわかりませんが、ガベージコレクションで実行時間が極端に遅くなるということは経験していません

参考になりますかどうか分かりませんが、C# cg 抑制 で次のようなページが見つかりました
http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld06/directxworld06_04.html
http://msdn.microsoft.com/ja-jp/library/system.gc.keepalive(v=vs.110).aspx
http://uchukamen.com/Programming/GC/

> C#のガーベッジコレクション機能を停止させる事は可能でしょうか。
オショウさんも書いていますが、可能とは思えません

> 勝手に解放したりするのでしょうか。
勝手に解放することはないでしょうが、 C++ で提供するオブジェクトを C# のコード内で new すれば
Dot Net のオブジェクトなのでガベージコレクションの対象になると思います。
引用返信 編集キー/
■69126 / inTopicNo.4)  Re[2]: C#のガーベッジコレクションの
□投稿者/ まくんわ (2回)-(2013/12/05(Thu) 14:14:56)

みなさんお返答ありがとうございます。

ちょっと困惑してしまいました、
私さき言った例では
ガーベッジコレクションを最大限に回避するために、
非local変数(メモリ)の使用をC++で作成した関数に任せるので、
これは当然newを使うしかないですね。

さもなければ、どうやって非local変数(メモリ)を確保するのでしょうか。
そして、newを使えば、CGが勝手に世話するなら、やっぱりCGの回避というのは成立できませんね。
いわゆる”アンマネージド”のC++中でも必ずnewで非local変数(メモリ)を確保するのですので。








No69119 (しま さん) に返信
> ■No69113 (まくんわ さん) に返信
>>早速ですけれども、
>>C#のガーベッジコレクション機能を停止させる事は可能でしょうか。
>>要は実行時間の安定性を図るために、極端に言えば、例えば、
>>非ローカルメモリを使う関数を全部C++で書いて、DLL化し、C#からコールします。
>>こんな場合でも C#のガーベッジコレクション機構はDLLの中で実装した関数が使用するメモルを管理したり、
>>勝手に解放したりするのでしょうか。
>>
>
> いっそ、全部 C++ で書けばいいのにと思いました
> 何を心配しているのかわかりませんが、ガベージコレクションで実行時間が極端に遅くなるということは経験していません
>
> 参考になりますかどうか分かりませんが、C# cg 抑制 で次のようなページが見つかりました
> http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld06/directxworld06_04.html
> http://msdn.microsoft.com/ja-jp/library/system.gc.keepalive(v=vs.110).aspx
> http://uchukamen.com/Programming/GC/
>
>>C#のガーベッジコレクション機能を停止させる事は可能でしょうか。
> オショウさんも書いていますが、可能とは思えません
>
>>勝手に解放したりするのでしょうか。
> 勝手に解放することはないでしょうが、 C++ で提供するオブジェクトを C# のコード内で new すれば
> Dot Net のオブジェクトなのでガベージコレクションの対象になると思います。
引用返信 編集キー/
■69127 / inTopicNo.5)  Re[3]: C#のガーベッジコレクションの
□投稿者/ Hongliang (135回)-(2013/12/05(Thu) 14:31:02)
C#におけるnewは、マネージヒープからメモリを取ってきます。当然、GC対象です。
C++におけるnewは、非マネージのどこかからメモリを取ってきます。ネイティブ上で動かすにせよC#などからDllImportなどによってマネージ環境上で動かすにせよ、このメモリはGCの対象外です。
オブジェクトではなく単にメモリブロックがほしいだけであれば、C#でもMarshal.AllocGlobalやWin32APIなどのメモリ確保関数を使えばアンマネージの(=GC対象外の)メモリを確保することもできます。

結局C#で(というか.NET Frameworkを)動かすのであればGCから逃れることはできませんので、
それでどれほど安定性とやらに貢献するかは知りませんが。

// Managed C++という、newする対象によってマネージか非マネージか自動で判断する言語もありましたが、
// 今はC++/CLIという言語に置き換わり、こちらではgcnewというキーワードが使われるようになりました。
引用返信 編集キー/
■69130 / inTopicNo.6)  Re[4]: C#のガーベッジコレクションの
□投稿者/ まくんわ (3回)-(2013/12/05(Thu) 16:48:52)
ご教授と貴重な情報本当にありがとうございます。
良く理解できた気分です。

// オブジェクトではなく単にメモリブロックがほしいだけであれば、C#でもMarshal.AllocGlobalやWin32APIなどのメモリ確保関数を使えばアンマネージの(=GC対象外の)メモリを確保することもできます。 //

これで助かりました!
知りませんでした。



解決済み
引用返信 編集キー/
■69131 / inTopicNo.7)  Re[5]: C#のガーベッジコレクションの
□投稿者/ 774RR (127回)-(2013/12/05(Thu) 17:32:38)
何を納得したのかよくわからないけど
・C# で Unmanage メモリを確保できること と
・その Unmanage メモリを使うこと との
間には深遠なる差があるわけで (結局 Marshal することになるだろう)

C# で Unmanage メモリを確保しても Manage オブジェクトとしては使えない。
C# で Unmanage メモリを確保しても Manage オブジェクトの gc はなくならない。
ので、当初の発言で意図していたであろう状況は何一つ変わっていない。

No69114 で訊ねられているとおり、どのくらいの時間を気にしているのか?次第。
ミリ秒程度の応答性の変動を気にするような状況なら、そもそも Windows を使うこと自体が間違い。

# ただのツッコミなので解決済みを維持
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -