【发布时间】:2012-04-29 18:00:51
【问题描述】:
我有一个包含共享库的算法的 C 实现。共享库的性能在 C 和 C++ 中有很大的不同(在 C++ 中的性能要好得多)。因此,我将 C 实现 (Imp-1) 的共享库部分更改为 C++ (Imp-2),同时保持其余部分不变。我在 Linux 中分别使用 gcc 和 g++ 编译了 Imp-1 和 Imp-2。在小型问题中,Imp-1 和 Imp-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 错误。