【问题标题】:32/64-bit Windows/Linux application [closed]32/64 位 Windows/Linux 应用程序 [关闭]
【发布时间】:2017-04-07 17:14:17
【问题描述】:

我编写了一个 C++ 程序,当它被编译为 64 位可执行文件时,它在 Linux 上运行良好。我还在 Windows 上将它编译为 32 位可执行文件,它崩溃并显示以下消息:

 boost\boost_1_55_0\boost/test/minimal.hpp(123): exception "std::bad_alloc: bad allocation" caught in function: 'int __cdecl main(int,char *[])'

由于我必须分配大小为 20000*20000 的整数矩阵,我告诉自己我可能超出了 32 位平台上允许的大小...

所以我将它编译为 64 位 Windows 可执行文件,它工作正常。为了检查我的假设是否正确,我决定将其编译为 32 位 Linux 可执行文件并且......它也可以正常工作吗?所以我不知道崩溃的原因可能是什么......

  • 32 位 Windows => 使用标准 bad_alloc 崩溃
  • 64 位 Windows => 运行正常
  • 32 位 Linux => 运行正常
  • 64 位 Linux => 运行正常

【问题讨论】:

标签: c++ linux windows boost 32bit-64bit


【解决方案1】:

32 位 Windows 为您提供不到 2GB 的地址空间,各种 DLL、您的程序、堆栈和您分配的任何其他内存散布在不同的地方。这有时意味着它在单个连续块中没有 1.5GB 的空间可供您使用。

它在 32 位 linux 中工作,因为我相信它实际上为您提供了 3GB 的地址空间。否则,它也会遇到同样的问题。

【讨论】:

  • 正如您所描述的,他肯定达到了 2GB 的进程限制。但只是好奇,对于虚拟内存,“连续块”真的很重要吗?即使代码确实成功地分配了整个 1.5GB 块,它也会被分配到不同的内存页面和虚拟内存中。 (或者我错过了什么?)
  • @selbie 它需要一块连续的虚拟地址空间,如何映射不相关。
  • @DanMašek - 这是有道理的。
  • 谢谢大家,这真的解释了一切
猜你喜欢
  • 2012-09-01
  • 2012-01-05
  • 2011-04-03
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多