簡體   English   中英

數組大小錯誤 x64 進程

[英]Array size error x64 process

我正在檢查我可以在 X64 應用程序上創建多大的數組,我的理解是我可以在 X64 進程上創建大於 2^31 的數組,但是我在 VS2010 編譯器上遇到編譯錯誤,代碼如下

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

在目標 x64 平台上的 VS2010 上給出編譯器錯誤“錯誤 C2148:數組的總大小不得超過 0x7fffffff 字節” ,我可以創建最多 (size_t(1)<<32 - 1);

我有鏈接器->高級->目標機器是 Machinex64。 還有鏈接器->系統->啟用大地址為是(不確定這是否真的很重要)。 pc 中存在的分頁文件\\Physical Ram 在這里是否重要? (我確定它是一個 64 位應用程序,因為如果我刪除該行並且只有 char* cp;它是 8 字節。)我是否缺少一些設置?

這似乎是 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];

當使用 32 位 x64 交叉編譯器編譯時,上述兩種方法都將失敗並顯示錯誤消息error C2148: total size of array must not exceed 0x7fffffff bytes 不幸的是,即使在 64 位版本的 Windows 上運行時,Visual Studio 也確實會啟動 32 位編譯器,目標是 x64。

可以應用以下解決方法:

  • 從命令行使用適用於 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 中,並且所有解決方法仍然適用。

編譯器可能會嘗試優化,因為您的 ARRSIZE 值是一個常量。 然后它達到了自己的靜態初始化限制。 您可能只需取出“const”關鍵字,它就會起作用。

如果沒有,這樣的事情可能會奏效。

extern size_t GetArraySize();

int main()
{
    size_t allocationsize = GetArraySize();

    char *cp = new char[allocationsize];
    return 0;
}

size_t GetArraySize()
{
    // compile time assert to validate that size_t can hold a 64-bit value
    char compile_time_assert_64_bit[(sizeof(size_t) == 8)?1:-1];

    size_t allocsize = 0x100000000UL; // 64-bit literal

    return allocsize;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM