さまざまなコンパイラでstd ::string_view をいじっていましたが、null 以外で終了する char 配列でstd::string_viewを初期化するときに、各コンパイラが異なるサイズを出力することに気付きました。
すべてのコンパイラは、最適化をオンにすると正しいサイズを出力しますが、最適化をオフにすると間違ったサイズを出力するようです (どちらの場合も正しいサイズを出力する 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';
}
出力: Visual 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
出力: Clang 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