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

问题描述 投票:0回答:1

我想查看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 /及其子目录,但我找不到它。

stdstring
1个回答
0
投票

您不能安全地在std名称空间中编辑/更改任何内容,并希望它以合理的方式工作。您得到不确定的行为。

可能发生的事情是您的更改更改了basic_string类的布局,但是您仍与假定旧布局的同一个libstdc ++共享库对象链接,所以情况会随机中断。

© www.soinside.com 2019 - 2024. All rights reserved.