C++ 由于在C++;std::带有g+的向量+;4.4.7 32位中的20120313

C++ 由于在C++;std::带有g+的向量+;4.4.7 32位中的20120313,c++,gcc,g++,C++,Gcc,G++,我在centos5.9 32位(在64位机器上运行)上编译,目标是32位。g++版本为4.4.7,这不是centos5.9默认提供的版本,但可以通过yum下载,并作为发行版的一部分提供 我有一个非常简单的循环,如下所示 std::vector<double> result(n); std::vector<double> values(n); // here I compute values(). They are correct and I extensively not

我在centos5.9 32位(在64位机器上运行)上编译,目标是32位。g++版本为4.4.7,这不是centos5.9默认提供的版本,但可以通过yum下载,并作为发行版的一部分提供

我有一个非常简单的循环,如下所示

std::vector<double> result(n);
std::vector<double> values(n);
// here I compute values(). They are correct and I extensively noted 
// that there's nothing wrong there. The problem is here
result[0] = 0.0;
for ( int i = 0 ; i < n-1 ; ++i ) {
    result[i+1] = result[i]+values[i];
    // printf("x");
}
问题是,我发现结果中存在微小但相关的数值差异,这取决于运算符[]是否为内联运算符。 类似地,如果取消对上面给出的printf()行的注释,我也会更改结果。 请注意,该问题不会发生在具有相同配置的centos59 64位中,或者如果发生,则低于可检测性


这是一个编译器错误,还是有一些微妙的魔法在发生?我试图检查asm和解析树,但它太复杂了,无法理解。我通常用C来管理,但是C++中,在生成的文件中会有太多的暗魔法。

可能是旧的X87乐趣特性,80位寄存器。将寄存器溢出到内存会导致舍入到64位,并且发生在不可预测的时刻。不是完全独特的C++,C有相同的问题。在Java中,它是“复杂的”


通过移动到64位构建和SSE进行修复。

只是一个不相关的补充说明:如果您完全在类中定义成员函数,就像您的运算符一样,那么它是隐式定义的
inline
。这里不需要
inline
关键字。约阿希姆:这一点很好,但我需要遵循我们的编码标准。@StefanoBorini:然后我建议更新:)索取样板文件似乎有点奇怪……在C语言中,你别无选择!有一次下午我玩得很开心…很有趣。你有什么链接让我可以进一步了解这个问题吗?
inline double & operator[] (int index) { return data_[index]; }