我将编译器从32转换为64位,但仍然不能使用超过2GB的空间:(为什么?

时间:2018-07-30 14:13:47

标签: c++ 64-bit

我可以创建此数组:

Sub ImpData()

'   Deactivate Screen Updating and Display Alerts
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'   Import Worksheet 1
Workbooks.Open Filename:= _
"Worksheet1_Filename.xlsx"
LastRow
NxtRow
Windows("Worksheet1.xlsx").Activate
ActiveWindow.Close

'   Import Worksheet 2
Workbooks.Open Filename:= _
"Worksheet2_Filename.xlsx"
LastRow
NxtRow
Windows("Worksheet2.xlsx").Activate
ActiveWindow.Close

'   Import Worksheet 3
Workbooks.Open Filename:= _
"Worksheet3_Filename.xlsx"
LastRow
NxtRow
Windows("Worksheet3.xlsx").Activate
ActiveWindow.Close

数组字节= 1,960,000,000字节,然后将gb = 1,96 GB转换为2 gb左右。

但是我不能同时创建这些:

int Array[490000000];


cout << "Array Byte= " << sizeof(Array) << endl;

为什么会出错?对不起,englisgh:)

我也这样检查我的编译器:

int Array[490000000];
int Array2[490000000];

它给了我8。

2 个答案:

答案 0 :(得分:1)

C ++程序通常不会编译为具有2Gb +的堆栈空间,而不管它是以32位模式还是64位模式编译的。堆栈空间可以作为编译器选项的一部分来增加,但是即使在允许将堆栈大小设置得很高的情况下,它仍然也不是理想的解决方案或推荐。

如果需要2Gb阵列,则应使用std::vector<int> Array(490'000'000);(强烈建议)或手动创建的阵列,即int* Array = new int[490'000'000];(请记住,手动分配的内存必须用{{1}手动释放) }),两者都会分配动态内存。您仍将希望以64位模式进行编译,因为如果不这样做,这将超出应用程序的最大内存限制,但是在您的方案中,由于2Gb小于最大内存限制,因此这不是严格必要的32位应用程序的内存。

答案 1 :(得分:0)

  

但是我仍然不能使用超过2 GB的空间:(为什么?

C ++语言没有语义来修改(也不报告)有多少自动内存可用(或者至少我没有看到过。)编译器依靠OS来提供一些“有用”的内存。您将需要搜索(google?您的硬件文档,用户手册等)多少。此限制取决于“计算机”,因为某些计算机没有所需的内存。

在Ubuntu上,对于最后几个发行版,Posix函数:: pthread_attr_getstacksize(...)报告每个线程8 M字节。 (我不确定适当的术语,但是)Linux称为“堆栈”的是C ++编译器用于自动内存的资源。因此,对于此版本的OS和编译器,自动var的限制为8M(比2G小得多)。

我想因为下一台机器可能有更多的内存,所以编译器可能会获得更大的自动内存,而且我还没有看到任何语义会根据执行编译的机器的内存大小来限制数组的大小... 不会有堆栈溢出的编译时间报告。

我看到Posix具有建议功能来调整堆栈大小的功能。我没有尝试过。

我还发现了可以报告和调整各种内存问题大小的Ubuntu命令。

来自https://www.nics.tennessee.edu/

  

修改限制的命令因外壳而异。 C shell(csh)和   其派生词(例如tcsh)使用limit命令修改限制。   Bourne shell(sh)及其派生词(例如ksh和bash)的使用   ulimit命令。这些命令的语法略有不同,   如下所示。可以在手册页中找到更多详细信息   用于您正在使用的外壳。

一个小实验...命令提示符

&dtb_chimes

启动此正在使用的应用程序,该应用程序使用Posix并报告8 MB堆栈(自动var)

使用ulimit前缀命令

$ ulimit -S -s 131072; dtb_chimes

该应用程序现在报告134,217,728

 ./dtb_chimes_ut

  default Stack size:  134,217,728
                argc:            1
  1   ./dtb_chimes_ut

但是我还没有确认实际的分配...这仍然比1.96 GB小很多...但是,也许您可​​以到达那里。

注意:我强烈建议std :: vector与大数组。


在我的Ubuntu桌面上,总共有4 GB的dram(我具有内存测试实用程序),而我的动态内存限制为大约3.5 GB。同样,动态内存量取决于计算机。

64位寻址的内存超出了我的承受能力。