【问题标题】:Failure on allocating memory in C/C++在 C/C++ 中分配内存失败
【发布时间】:2012-04-29 18:00:51
【问题描述】:

我有一个包含共享库的算法的 C 实现。共享库的性能在 C 和 C++ 中有很大的不同(在 C++ 中的性能要好得多)。因此,我将 C 实现 (Imp-1) 的共享库部分更改为 C++ (Imp-2),同时保持其余部分不变。我在 Linux 中分别使用 gcc 和 g++ 编译了 Imp-1Imp-2。在小型问题中,Imp-1Imp-2 的表现完全相同。然而,在同样的大型问题中,Imp-1 没有任何问题地解决它,Imp-2 返回 std::bad_alloc 错误。有趣的是,当可用内存为 35GB 的内存使用量增加到 4GB 时,会发生此错误。

为什么会出现这个错误? (编译器、操作系统、编译器选项等)

最好的问候。

【问题讨论】:

  • C 实现是否适用于同样的大型问题?还是您只测试了基准测试中的小问题? C++ 抛出 std::bad_alloc 的地方 C 通常返回一个空指针,当缺少显式检查时,它可能会在一段时间内被忽视。知道从哪里抛出 std::bad_alloc 也会很有趣。例如,std::vector 经常使用指数方案来调整大小,因此在需要所有这些空间之前它可能会增长到 4GB。如果您在某些地方使用std::vector::resize,即使在 32 位系统上,它也可能适用于更大的尺寸。
  • 我在 64 位系统(Red Hat Enterprise Linux Server 5.6 版)上运行代码。我检查了 Makefile,在使用 g++ 编译 C++ 实现时添加了 -m64 选项。 C 实现独立于实例(小或大)工作正常。我给两个实现都提供了相同的实例(它是一个大实例),而 C 最终很好,C++ 在某些时候返回 std::bad_alloc 错误。

标签: c++ c


【解决方案1】:

您的 gcc 似乎是 64 位编译器,而 g++ 是 32 位编译器。即使您在 32 位系统上运行,除非您使用 64 位编译器编译程序,否则您的程序无法充分利用 64 位寻址功能,如果您想要寻址超过 4GB,这将导致您遇到的 bad_alloc。

我确信您在 64 位上运行 32 位编译程序的原因是 4GB 的限制。一般来说,内存被划分为用户/内核空间,在 32 位系统上,整个 4GB 是不可用的,通常在 2GB 和 3GB 之间。由于您可以处理整个 4GB,因此您似乎在 64 位环境中运行 32 位程序。

【讨论】:

  • 我在 64 位系统(Red Hat Linux)上运行代码,并且在使用 g++ 编译期间启用了 -m64 选项。我如何确保我正在使用 64 位 g++ 进行编译。
  • @Gokhan:好问题。运行objdump -f <YourExecutable>|grep file。如果你得到file format elf64-x86-64,它是一个64位的可执行文件,否则如果你得到file format elf32-i386,它是一个32位的可执行文件。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 2015-05-29
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2014-10-25
相关资源
最近更新 更多