簡體   English   中英

這些編譯器之間有什么區別嗎?

[英]Is there any difference between these compilers?

我在不同的環境中運行相同的代碼。

第一個是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 .....

在標准C ++庫中同時存在std :: stable_sortstd :: sort ,這是有充分理由的。 如果兩者相同,則只有一個標准化。

如果要穩定排序 ,請使用std::stable_sort 如果您想要快速排序,請僅使用std::sort並為實現留出更多自由。 當C ++標准允許它們具有一定的自由度時,不要指望不同的編譯器會給出完全相同的結果。

請注意,編程語言是一種規范 ,用英語編寫。 花更多時間閱讀您喜歡的C ++標准,例如用於C ++ 11的 n3337 注意未指定的行為和更危險的未定義的行為

第二個是gcc 4.8.5

請注意, GCC 4.8是過時的不受支持的編譯器 自2019年5月起, GCC的當前版本為GCC 9 我強烈建議使用最新的GCC編譯器(至少在2019年夏季為GCC 8 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM