1

次のコードスニペットは、公式GNOME2開発者ガイドからのものです。

GMemChunk my_chunk;
my_chunk = g_mem_chunk_new("My Chunk",
                           42,
                           42*16,
                           G_ALLOC_AND_FREE);
gchar *data[50000];
gint i;

/* allocate 40,000 atoms */
for(i = 0; i < 40000; i++)
{
   data[i] = g_mem_chunk_alloc(my_chunk);
}
  • これは、すべてのアトムが42バイトであり、各「メモリチャンク」に42個の16アトムが含ま40000/16=2500れ、上記のコードを実行するとメモリチャンクが作成されることを意味しますか?

  • なぜここでgchar*を使用しているのですか?が実行されると、gpointer(void *)からgchar *への暗黙のキャストが行われdata[i] = g_mem_chunk_alloc(my_chunk);ますか?

  • 上記のステートメントが当てはまる場合、各gchar*は42バイトのメモリを指します。では、特定のアトムのすべてのバイトにアクセスするにはどうすればよいですか?data[7]+41使用可能なメモリロケーションになりますか?


  • コードをコンパイルしようとすると、gccは次のエラーメッセージを生成します。

    error: storage size of ‘my_chunk’ isn’t known どうしたの?

4

1 に答える 1

3

ご質問の順番:

  • 各メモリブロックには16個のアトムが含まれていますが、それ以外はそうです。
  • はい、void *C の他のポインター型に暗黙的に変換できます。これは通常、適切な C スタイルと見なされます。彼らがgchar *ここで使用しているのは、明らかに各アトムを 42 の配列として扱いたいからですgchar
  • はい、data[7][41]8 番目のアトムの最後のアクセス可能なバイトです。
  • エラーは、 の宣言my_chunkが間違っているためです (GMemChunkは、コードで直接インスタンス化してはならない不透明な型です)。宣言は次のようにする必要があります。

    GMemChunk *my_chunk;

g_mem_chunk_new()との署名に従ってg_mem_chunk_alloc()

ちなみに、Glib のドキュメントには、Chunk アロケーターは非推奨であり、代わりにスライス アロケーターを使用する必要があると記載されています。

于 2010-03-03T04:24:20.333 に答える