对于c++ 标准库里的string(或wstring)
存储字符串是有潜规则的
先看看_Bx这玩意
union _Bxty
{ // storage for small buffer or pointer to larger one
_Elem _Buf[_BUF_SIZE
];
_Elem *_Ptr;
char _Alias[_BUF_SIZE
]; // to permit aliasing
} _Bx;
而_BUF_SIZE为
enum
{ // length of internal buffer, [1, 16]
_BUF_SIZE
= 16 / sizeof (_Elem) < 1 ? 1
: 16 / sizeof (_Elem)};
当字符串长度小于默认的_BUF_SIZE时用_Bx._Buf
而默认的_BUF_SIZE一般为16(实际上_Bx._Buf存储15个而已)
大于这默认值才给_Bx._Ptr分配内存
在小于_BUF_SIZE的情况下直接调用_Bx._Ptr程序会挂掉的
空指针嘛。。。
看看成员函数c_str()
const _Elem *c_str() const
{ // return pointer to null-terminated nonmutable array
return (_Myptr());
}
const _Elem *_Myptr() const
{ // determine current pointer to buffer for nonmutable string
return (this->_BUF_SIZE
<= this->_Myres
? this->_Bx._Ptr
: this->_Bx._Buf);
}
看到没,最终还是要判断长度先的
本文详细解析了C++标准库中string类型的内部实现机制,包括_Bx联合体的使用及不同存储方式的选择依据,介绍了c_str()成员函数的实现细节。
361

被折叠的 条评论
为什么被折叠?



