1

[x][4096] (たとえば int table[4096][4096]) のテーブルを取得したいのですが、その方法がわかりません - 特により一般的な方法で (多くのコンパイラでも古いコンパイラでも使用されます) (mingw、dmc、lcc、b55)

各行が1つ(または複数)のシステムページに入力されるテーブルウィッチを取得したい(効率のために、私が知る限り、より高速になりますか?)
システムページのセットを埋めるann配列を取得し、それは彼らと非常に一致しています

(ページのズレや空白はなくしたい)

1) この方法で静的配列を取得できますか (多くのコンパイラで) 2) malloc の方法でどのように行うことができますか? (malloc は RAM の前にいくつかのメタデータを配置できるため、画像が損なわれる可能性があることを漠然と覚えています。おそらく、正確な量のバイトを割り当てていない可能性もありますが (?)、それについてはわかりません

このような明確な割り当てを取得できますか?たとえば、256 の整列された 4K ページをテーブルとして取得できますか?

4

4 に答える 4

2

Windows のページ割り当て機能はVirtualAlloc. MEM_COMMIT | MEM_RESERVE予約だけでなく、実際の割り当てを取得するには、両方を渡します。

于 2012-11-30T10:41:13.193 に答える
1

必要な位置合わせを行うことはできますが、位置C/C++合わせの定義に関する標準的な指示がないため、移植性はありません。

静的データの場合、通常は#pragmaコンパイラの組み込み関数です。

たとえば、VC++ には、__declspec( align( # ) )データの配置に使用できる があります: http://msdn.microsoft.com/en-us/library/83ythb65(v=vs.110).aspx

動的データの場合、これは同じ移植性のないソリューションです。詳細については、@mvp の回答を参照してください。mallocただし、動的データの場合は、標準関数に基づいて、独自の整列データ アロケーターを実装できます。標準ライブラリに基づいているため、アロケータはポータブルになります

于 2012-11-30T08:55:09.790 に答える
1

質問には winapi というタグが付けられているので、Windows を使用していると思います。その場合、おそらく単純に を使用したいでしょう_aligned_malloc()

Linux/POSIX システムでは、posix_memalign().

これらの API のいずれかを使用して、4KB にアラインされる大きなメモリ ブロックを割り当てる必要があります。次に、通常のポインターを使用してアクセスするだけです。

于 2012-11-30T08:01:06.200 に答える
0

ポインターを過剰に割り当てて微調整できます。

 int *a = malloc(4096*4096*4+4095);
 int *b = (int*) (((int)a)+4095 & (~4095)));

また、たとえば 64 + 64 バイトを割り当て、アドレスが 80 バイト離れていることを確認し、次の割り当て単位の長さ L を計算して、大きな単位を特定のアドレスに整列させることも可能です (ただし、保証はされません)。

#include <string.h>
#include <stdio.h>
int main()
{
  int *a = malloc(64);
  int *b = malloc(64);
  long long excess = ((long)b - (long)a)-64;
  int *c = malloc(4096 - (((int)(b) & 4095) + excess*2 + 64));
  int *d = malloc(4096*4);
  printf("%x %x %x %x\n",
     (int)a & 0xffffffff,(int)b & 0xffffffff, 
     (int)c & 0xffffffff,(int)d & 0xffffffff);
}

出力:18e2010 18e2060 18e20b0 18e3000

ただし、1 つの通知: d=malloc(4096*4096) の最後の malloc が失敗しました (そして 0x55505010 が生成されました)。これは、glib 実装が異なるプールまたは異なるメソッド (システム コールkmalloc など)から異なるサイズのユニットを割り当てるためです。すべての実行の最初に割り当てられたアドレスは、正確に 10 (16 進数) バイトだけバイアスされているようです。これは、ブックキーピングに必要なスペースであり、システムによってヒープが既に 4096 バイト境界に配置されているようです。

于 2012-11-30T10:03:26.993 に答える