我想查看basic_string这个函数size()和lenght()的实际定义,因为Bjarne在他的书中写道,'strlen()是log(N)运算符-,而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()是不同的...即使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 ++共享库对象链接,所以情况会随机中断。