为什么 basic_string::size() 和 '_M_string_length' 在同一类中返回 **不同的**值,即使 size() 返回 'size_type _M_string_

  • 本文关键字:size string 返回 type 即使 length basic 一类 stdstring
  • 更新时间 :
  • 英文 :


我想看看这个函数 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++共享库对象链接,因此事情随机中断。

最新更新