我想看看这个函数 size(( 和 length(( 的实际定义 basic_string,因为在他的书中,Bjarne 写道 'strlen(( 是一个 log(N( 歌剧 tion,而 string::size(( 是一个简单的读取'。然后我发现,有"_M_string_length"(在第 156 行以 bits/basic_string.h 表示为私有(
我在课堂上公开了_M_string_length成员(并评论了私人成员(。
但
std::string str="Hello"
std::cout<<str._M_string_length<<'n'<<str.length()<<'n'<<str.size()<<'n';
给出了这个输出:
140723012417600 //kept changing in various runs
5
5
为什么_M_string_length和大小((不同...即使 size(( 也按原样返回_M_string_length,并且它的类型也是size_type?是因为那个_GLIBCXX_NOEXCEPT吗?
对于_GLIBCXX_NOEXCEPT,我运行了以下内容...
cat /usr/include/c++/7.4.0/bits/* | grep "#define _GLIBCXX_NOEXCEPT"
并在它们内部的所有目录中...像/usr/include/和/c++/7/及其子目录,但我找不到它。
您无法安全地编辑/更改std
命名空间中的任何内容,并期望它以合理的方式工作。 你会得到未定义的行为。
可能发生的情况是,您的更改更改了basic_string类的布局,但您仍然与假定旧布局的同一libstdc++共享库对象链接,因此事情随机中断。