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

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

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

Re[1]: C# 配列をスタックメモリに配置したい


(過去ログ 119 を表示中)

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

■69652 / inTopicNo.1)  C# 配列をスタックメモリに配置したい
  
□投稿者/ yoshi (1回)-(2014/01/17(Fri) 12:22:14)

分類:[C#] 

2014/01/17(Fri) 12:27:47 編集(投稿者)
2014/01/17(Fri) 12:27:43 編集(投稿者)

for(int i = 0; i < 1000000; i++)
{
char buffer[256];
buffer[xx] = yy; ....
}

Cならば、上記のbuffer はスタックメモリにあり、
同様に、C#ならば、

for(int i = 0; i < 1000000; i++)
{
char[] buffer = new char[256];
buffer[xx] = yy; ....
}

ヒープメモリになり、速度が極端に遅いです。

どうすれば、unsafe を使わずに、
C#もC見たいに、配列をスタックメモリに配置できますか。

よろしくお願いします。


引用返信 編集キー/
■69653 / inTopicNo.2)  Re[1]: C# 配列をスタックメモリに配置したい
□投稿者/ Hongliang (155回)-(2014/01/17(Fri) 12:27:18)
配列は.NET/C#においては参照型オブジェクトなので、インスタンスをスタックに確保することはできません。
ポインタで良ければ、stackallocキーワードで確保することができます。
引用返信 編集キー/
■69654 / inTopicNo.3)  Re[2]: C# 配列をスタックメモリに配置したい
□投稿者/ yoshi (2回)-(2014/01/17(Fri) 12:33:37)
No69653 (Hongliang さん) に返信
> 配列は.NET/C#においては参照型オブジェクトなので、インスタンスをスタックに確保することはできません。
> ポインタで良ければ、stackallocキーワードで確保することができます。

ご回答ありがとうございます。
#質問を回答見ずに編集してしまって申し訳ありませんでした。

> ポインタで良ければ、stackallocキーワードで確保することができます。
unsafe でコンパイル必要があるので、
なるべく避けたいです。

無理でしょうかな。

引用返信 編集キー/
■69655 / inTopicNo.4)  Re[3]: C# 配列をスタックメモリに配置したい
□投稿者/ Hongliang (156回)-(2014/01/17(Fri) 12:46:25)
2014/01/17(Fri) 17:25:28 編集(投稿者)

<del>あとはMarshal.AllocGlobalで確保して全部Marhsal::WriteXXXおよびMarshal::ReadXXXを使う方法ですが、これは多分速度は稼げないでしょうね。</del>
<ins>追記:これは全くピント外れですね。すいません。</ins>

どうしても速度が必要な箇所であれば、ある程度大きい単位で全てC++に投げてしまうとか。

一応、構造体にフィールドを一つずつ記述していってもスタックで確保という意味では可能ですが、アクセスはめんどくさいというか意味のある操作はほぼ不可能かなぁ。
引用返信 編集キー/
■69657 / inTopicNo.5)  Re[1]: C# 配列をスタックメモリに配置したい
□投稿者/ とっちゃん (186回)-(2014/01/17(Fri) 13:23:17)
とっちゃん さんの Web サイト
No69652 (yoshi さん) に返信
> 2014/01/17(Fri) 12:27:47 編集(投稿者)
> 2014/01/17(Fri) 12:27:43 編集(投稿者)
>
> for(int i = 0; i < 1000000; i++)
> {
> char buffer[256];
> buffer[xx] = yy; ....
> }
>
> Cならば、上記のbuffer はスタックメモリにあり、
> 同様に、C#ならば、
>
> for(int i = 0; i < 1000000; i++)
> {
> char[] buffer = new char[256];
> buffer[xx] = yy; ....
> }
>
> ヒープメモリになり、速度が極端に遅いです。
>
> どうすれば、unsafe を使わずに、
> C#もC見たいに、配列をスタックメモリに配置できますか。
>
> よろしくお願いします。
>
上記の例で、Cのコードが、バグっていないという条件が付くのであれば、メモリを使いまわしできるので
char[] buffer = new char[256];
for( ... )
{
...
}
とすることができます。

こうすれば、配列の確保は1回だけになるので、速度的な問題は解消できると思います。
ただし、これが可能かどうかは、このコードだけではわかりませんが。。。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -