C++ 向量<;bool>;::在GCC 3.4.3中推回错误?

C++ 向量<;bool>;::在GCC 3.4.3中推回错误?,c++,stl,arm,inline,gcc3,C++,Stl,Arm,Inline,Gcc3,以下代码在我使用GCC为ARM构建时崩溃: #include <vector> using namespace std; void foo(vector<bool>& bools) { bools.push_back(true); } int main(int argc, char** argv) { vector<bool> bools; bool b = false; bools.push_back(b);

以下代码在我使用GCC为ARM构建时崩溃:

#include <vector>

using namespace std;

void foo(vector<bool>& bools) {
    bools.push_back(true);
}

int main(int argc, char** argv) {

    vector<bool> bools;
    bool b = false;
    bools.push_back(b);
}
#包括
使用名称空间std;
void foo(向量和布尔){
bools.push_back(真);
}
int main(int argc,字符**argv){
矢量布尔;
布尔b=假;
bools.推回(b);
}
我的编译器是:
arm_v5t_le-gcc(gcc)3.4.3(MontaVista 3.4.3-25.0.30.0501131 2005-07-23)
。构建用于调试时不会发生崩溃,但在优化设置为-O2时会发生崩溃

是的,foo功能是重现问题所必需的。这在一开始是非常令人困惑的,但我发现只有当push_-back调用没有内联时才会发生崩溃。如果GCC注意到push_-back方法被多次调用,它将不会在每个位置内联它。例如,我还可以通过在main中调用push_back两次来重现崩溃。如果将foo设为静态,那么gcc可以告诉您从未调用过它,并将对其进行优化,从而使push_返回到main中,从而不会发生崩溃

我已经用GCC4.3.3在x86上试过了,看来该版本的问题已经解决了

因此,我的问题是:

还有其他人碰到过这个吗?也许我可以传递一些编译器标志来阻止它

这是gcc代码生成中的错误,还是stl实现(bits/stl_bvector.h)中的错误?(我计划在有时间的时候自己测试一下)

如果编译器有问题,是升级到4.3.3解决了问题,还是从arm切换到x86


顺便说一句,大多数其他
vector
方法似乎都有效。是的,我知道使用
vector
不是世界上最好的选择。

你能用gcc 3.4.6和Montavista的补丁构建自己的工具链吗?3.4.6是3.x系列的最后一个版本

如果您需要,我可以附加一些说明,说明如何从GCC源代码构建ARM交叉编译器。我必须一直这么做,因为没有人为MacOSX预先构建工具链


如果GCC4.x中的ARM被破坏,我会非常惊讶。但唯一的测试方法是,您或其他人是否可以在针对GCC4.x的ARM上进行测试。

升级到GCC4是一个安全的选择。它的代码生成后端使用SSA(静态单赋值)替换旧的RTL(寄存器传输语言)表示。此更改允许对优化器进行重大重写

经常使用矢量是世界上最好的选择。它是一个好的、合理的、高性能的数据结构,而且比您自己编写的任何东西都要安全得多int main?实际上,我的意思是向量。只因为它的行为与“代码”>“0”<代码>的“正常”向量不同,GCC允许您在C++代码中使用C99的东西,所以我利用它来保存一些类型:)同意,<代码> STD::vector < /C>至少与你手上的代码一样好。不使用它的唯一原因是,如果您希望在对象存储中使用,并且不需要动态更改大小。而且看起来你需要动态地改变大小(例如,
push_back()
)。是的,我有点希望“其他人”选项:)我可以更新我们的工具链,但我希望首先知道它是否真的有用。