10

I was checking how big of an array can I create on a X64 application, my understanding was that I can create arrays bigger than 2^31 on X64 process but I'm getting a compilation error on VS2010 compiler, below code

const size_t ARRSIZE = size_t(1)<<32;
int main()
{
    char *cp = new char[ARRSIZE];
    return 0;
}

gives compiler error "error C2148: total size of array must not exceed 0x7fffffff bytes" on VS2010 on target x64 platform, I can create upto (size_t(1)<<32 - 1);

I have Linker->Advanced->Target Machine is Machinex64. Also Linker->System->Enable Large Addresses as Yes ( Not sure if this really matters ). Does the paging file\Physical Ram present in the pc matter here? (I'm sure that it is a 64-bit app because if I remove that line and just have char* cp; it is 8-byte.) Am I missing some settings?

4

2 に答える 2

7

これは、x64 ターゲット用の 32 ビット クロス コンパイラの不具合のようです。上記のコメントで icabod が投稿したMicrosoft Connect リンクは、この特定の問題に対処しています。残念ながら、バグのステータスはClosed - Won't Fixに設定されています。

次のコード スニペットは、x64 用の 32 ビット クロス コンパイラを使用してコンパイルできません。

char* p = new char[(size_t)1 << 32];

const size_t sz = (size_t)1 << 32;
char* p = new char[sz];

error C2148: total size of array must not exceed 0x7fffffff bytesx64 用の 32 ビット クロス コンパイラでコンパイルすると、上記の両方が失敗し、エラー メッセージが表示されます。残念ながら、Visual Studio は、x64 を対象とする 64 ビット バージョンの Windows で実行されている場合でも、32 ビット コンパイラを起動します。

次の回避策を適用できます。

  • コマンド ラインから x64 用のネイティブ 64 ビット コンパイラを使用してコードをコンパイルします。
  • コードを次のいずれかに変更します。

    size_t sz = (size_t)1 << 32;  // sz is non-const
    char* p = new char[sz];
    

    また

    std::vector<char> v( (size_t)1 << 32 );
    

このバグは Visual Studio 2012 にも存在し、すべての回避策が引き続き適用されます。

于 2013-11-08T21:22:14.517 に答える