C++ string的SSO

发布时间:2019-06-22 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了C++ string的SSO脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

C++的string相对于c语言的string完善了很多,通过运算符重载可以很直观的进行字符串的拼接等操作。

GCC 5.0以后的版本采用了__SSO__(短字符串优化)的策略替换了原本的__COW__优化,我写了几段代码来验证了一下新的实现的一些细节


PS:这里的所有的内容只是特定平台特定编译器的特定行为。

平台: Windows 64位 MinGW 7.3.0


#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{

    string a = "123456789abcde"; //15个char
    string s("this is the edge"); //16个char
    string longstr("Scaramouche, scaramouche will you do the Fandango"); //长串 在heap分配
    
    cout << &a << "     " << (void*)a.c_str() << endl;
    cout << &s << "     " << (void*)s.c_str() << endl;
    cout << &longstr << "     " << (void*)longstr.c_str() << endl;

    cout << sizeof(char*) << endl;

    cout
        << sizeof(s) << endl;
    return 0;
}
0x62fde0     0x62fDF0
0x62fdc0     0x7d17d0
0x62fda0     0x7d1b40
8
32

在这里我通过c_str打印串开始的地址。

从输出我们可以看出来string占32个字节,其中16个字节实际上用于存储字符。

我们创建出来的三个对象地址相差0x20(32)个字节,后两个的指针地址于对象的地址相差很远,应该是在堆上动态分配的内存,而第一个字符串的存储地址(0x62fdf0)于对象的起始地址(0x62fde0)只差__0X10__,而对象大小__0x20__,所有这个串实际上就是存储在这个程序栈中.

上文的 SSO 实际上值得就是短的字符串(strlen(s)<15,即最多包含15个char和'0')直接存储在对象里,更长的串再存储在堆上开辟的空间里。

C++的stringxstringsds在很多情况下很相像。

脚本宝典总结

以上是脚本宝典为你收集整理的C++ string的SSO全部内容,希望文章能够帮你解决C++ string的SSO所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。