-2

私はそれが非常に基本的な質問であることを知っています. ウィキペディアといくつかの MSDN ページからメモリ管理を読みました。しかし、プログラムの実行中に以下の処理がどのように行われるかはまだわかりません。

プログラム内で長い文字列を宣言するとき

  1. 値を格納するためにどのメモリ コンパイラを使用しますか? (RAMだと思います)
  2. どのくらいのメモリ容量が必要ですか? (「私はコンピューター プログラミングの初心者です」のような 8 ビット マシンと文字列であると考えてください)
  3. 実行時に文字列値を更新すると、どのメモリ アドレスに文字列値が存在するかをコンパイラが認識する方法
  4. マトリックスを作成すると、個々の値がどのようにメモリに格納されるのでしょうか?

私が .Net で C# を使用していることを考慮してください。

前もって感謝します。

4

1 に答える 1

2

最初の部分、弦。

多くの人が言ったように、文字列を表す方法はたくさんあります。最も一般的な方法は、文字列を配列として格納することです。ただし、この配列の長さという追加情報が必要です。

各 (手続き型または命令型) 言語は、この問題を異なる方法で解決します。

  1. 配列の最初の数バイトに文字列の長さが格納される「パスカル文字列」があります。

  2. 長さを格納するための追加のバイトがない「C 文字列またはヌル終了文字列」がありますが、配列の最後のバイトの値はゼロです。

  3. COM では、BSTR というハイブリッド アプローチが使用されます。最初に 4 バイトを使用して文字列の長さを格納、最後に 2 バイトのマーカー (2 つのゼロ バイト) を格納します。文字列を C プロシージャに渡すと同時に、長さをすばやく取得できます。

関数型言語は、まったく別のストアです。

2番目の部分、マトリックス。

多次元 (この場合は 2 次元) 配列を格納するには、それを「線形化」する必要があります。つまり、コンピューターのメモリ ハードウェアを使用するために、1 次元配列に変換する必要があります。

だから保存するには

float A[W][H];

少なくとも割り当てます

sizeof(float)*W*H

データを格納するためのメモリのバイト。A[i][j] へのアクセスは、アドレスのメモリ バイトにアクセスすることによって行われます。

addr(A) + (i * H + j)

または住所

addr(A) + (j * W + i)

これらは、C と Fortran で採用されている 2 つのアプローチです。

ただし、疎行列を保存する必要がある場合は、他のオプションがいくつかあるかもしれません。たとえば、行列のゼロ以外の要素を表すトリプル (i,j,value) を格納できます。

于 2012-05-30T20:15:34.090 に答える