string_view 对比 const char* 性能
string_view Vs const char* performance
下面代码中 std::string_view
参数是否优于 const char*
参数?
void func( const std::string_view str )
{
std::istringstream iss( str.data( ) ); // str is passed to the ctor of istringstream
std::size_t pos { };
int num { std::stoi( str.data( ), &pos, 10 ) }; // and here it's passed to std::stoi
}
int main()
{
std::array<char, 20> buffer { };
std::cin.getline( buffer.data( ), 20 );
func( buffer.data( ) );
}
std::istringstream
ctor 和 std::stoi
都需要一个 const std::string&
作为它们的参数。但是我使用 data()
成员函数向他们传递了一个 std::string_view
对象。这是不好的做法吗?我应该恢复到 const char*
吗?
But I pass them a std::string_view object using its data() member function. Is this bad practice
是的,这是一种不好的做法。这很糟糕,主要是因为字符串视图不一定指向以 null 结尾的字符串。如果没有,将 data()
传递给需要空终止的函数将导致未定义的行为。
其次,在某些情况下,事先知道字符串的长度会更有效率。长度是已知的,因为它存储在字符串视图中。当您仅将 data()
用作参数时,您并未向函数提供已知大小。
改用这个:std::istringstream iss(std::string{str});
Should I revert back to const char*?
在这种情况下,我认为没有充分的理由这样做。
下面代码中 std::string_view
参数是否优于 const char*
参数?
void func( const std::string_view str )
{
std::istringstream iss( str.data( ) ); // str is passed to the ctor of istringstream
std::size_t pos { };
int num { std::stoi( str.data( ), &pos, 10 ) }; // and here it's passed to std::stoi
}
int main()
{
std::array<char, 20> buffer { };
std::cin.getline( buffer.data( ), 20 );
func( buffer.data( ) );
}
std::istringstream
ctor 和 std::stoi
都需要一个 const std::string&
作为它们的参数。但是我使用 data()
成员函数向他们传递了一个 std::string_view
对象。这是不好的做法吗?我应该恢复到 const char*
吗?
But I pass them a std::string_view object using its data() member function. Is this bad practice
是的,这是一种不好的做法。这很糟糕,主要是因为字符串视图不一定指向以 null 结尾的字符串。如果没有,将 data()
传递给需要空终止的函数将导致未定义的行为。
其次,在某些情况下,事先知道字符串的长度会更有效率。长度是已知的,因为它存储在字符串视图中。当您仅将 data()
用作参数时,您并未向函数提供已知大小。
改用这个:std::istringstream iss(std::string{str});
Should I revert back to const char*?
在这种情况下,我认为没有充分的理由这样做。