2016-10-23 67 views
0

我玩弄的std :: string_view有不同的編譯器,發現每個編譯器打印出的initiliazing性病當不同尺寸:: string_view用非空終止的char數組。差異終止字符數組

似乎每個編譯器在打開優化時都打印出正確的大小,但在優化關閉時會打印出錯誤的大小(除了GCC,這兩種情況都會打印出正確的大小)。

我的問題是:爲什麼會出現這種情況?

代碼:

// test.cpp 

#include <iostream> 

#ifdef __MINGW32__ 
#include <experimental/string_view> 
#elif _MSC_VER 
#include <string_view> 
#endif 

int main() 
{ 
    const char foo[3]{ 'f','o','o' }; 

#ifdef __MINGW32__ 
    std::experimental::string_view str_v{ foo }; 
#elif _MSC_VER 
    std::string_view str_v{ foo }; 
#endif 

    std::cout << sizeof(foo) << " " << str_v.size() << '\n'; 
} 

輸出:視覺C++ 19.00.24619.0

3 5 // cl /Zi /std:c++latest /EHsc /nologo /W4 test.cpp 
3 3 // cl /O2 /std:c++latest /EHsc /nologo /W4 test.cpp 

輸出:鏘4.0.0-r282394(使用MinGW的-W64)

3 4 // clang++ -g --target=x86_64-w64-mingw32 -std=c++1z -Wall -o test.exe test.cpp 
3 3 // clang++ -02 --target=x86_64-w64-mingw32 -std=c++1z -Wall -o test.exe test.cpp 

輸出: GCC 6.2.0(MinGW-w64)

3 3 // g++ -g -std=c++1z -Wall -o test.exe test.cpp 
3 3 // g++ -O2 -std=c++1z -Wall -o test.exe test.cpp 
+11

未定義的行爲未定義。 –

+0

如下所述,您需要以'\ 0'爲空來終止字符串,或者使用一個爲空終止的const char *字符串。 – MarcD

回答

8

cppreference.com

constexpr basic_string_view(常量圖表* S);

構造了以null結尾的字符串指向 的視圖,其中不包括終止空字符。

您的測試程序會導致未定義行爲,如T.C.在上面的評論中已經提到。

+1

'string_view'有另一個接受'count'作爲輸入的構造函數,例如:'string_view str_v {foo,sizeof(foo)};' –

+0

@RemyLebeau是的,但是我決定不再提及它。 –