这些编译器之间是否有任何区别

Is there any difference between these compilers?

本文关键字:任何 区别 是否 之间 编译器      更新时间:2023-10-16

i在不同环境中运行相同的代码。

第一个是IDE(Visual Studio 2017(。第二个是GCC 4.8.5提供的WebCompiler。

但是,我得到了不同的结果!

这是我运行的示例代码。

#include<iostream>
#include<vector>
#include<algorithm>
class Data
{
public:
    int num1;
    int num2;
    Data(int _num1, int _num2)
    {
        num1 = _num1;
        num2 = _num2;
    }
    bool operator<(const Data &input) const
    {
        if (this->num1 < input.num1)return true;
        else return false;
    }
};
int main()
{
    std::vector<Data> vec;
    vec.push_back(Data(5, 3));
    vec.push_back(Data(6, 0));
    vec.push_back(Data(6, 1));
    vec.push_back(Data(6, 2));
    vec.push_back(Data(6, 4));
    vec.push_back(Data(9, 5));
    vec.push_back(Data(12, 6));
    vec.push_back(Data(14, 7));
    vec.push_back(Data(16, 8));
    vec.push_back(Data(16, 10));
    vec.push_back(Data(18, 9));
    vec.push_back(Data(20, 11));
    vec.push_back(Data(20, 12));
    vec.push_back(Data(21, 14));
    vec.push_back(Data(22, 13));
    vec.push_back(Data(24, 15));
    vec.push_back(Data(25, 18));
    vec.push_back(Data(26, 16));
    vec.push_back(Data(25, 17));
    vec.push_back(Data(28, 19));
    vec.push_back(Data(30, 20));
    vec.push_back(Data(29, 21));
    vec.push_back(Data(31, 23));
    vec.push_back(Data(32, 22));
    vec.push_back(Data(34, 24));
    vec.push_back(Data(34, 26));
    vec.push_back(Data(36, 25));
    vec.push_back(Data(36, 27));
    vec.push_back(Data(38, 28));
    vec.push_back(Data(38, 30));
    vec.push_back(Data(40, 29));
    vec.push_back(Data(41, 32));
    vec.push_back(Data(42, 31));
    vec.push_back(Data(42, 34));
    vec.push_back(Data(44, 33));
    vec.push_back(Data(46, 35));

    std::sort(vec.begin(), vec.end());
}

当我尝试打印vec的元素时,在IDE的情况下,我得到了结果。


5 3
6 0
6 1
6 2
6 4
9 5
12 6.....

但是使用GCC,我的结果低于结果。
5 3
6 0
6 4
6 2
6 1
9 5
12 6.....

sTD :: stable_sort和std ::在标准C 库中排序,这是有充分理由的。如果两者都相同,则只有一个标准化。

如果您想要稳定的排序,请使用std::stable_sort。如果您想要快速的排序,请仅使用std::sort,并为实施留下更多自由。当C 标准允许对它们有所自由时,不要指望不同的编译器会给出完全相同的结果。

请注意,编程语言是规范,用英语编写。花更多的时间来阅读您喜欢的C 标准,例如C 11的N3337。要注意未指定的行为和更危险的不确定行为。

第二个是GCC 4.8.5

请注意, GCC 4.8是一个过时的编译器。当前版本的GCC是自2019年5月以来的GCC9。我强烈建议使用最近的GCC编译器(至少在2019年夏季GCC 8(。

相关文章: