__sso_string与std::string的区别
来源:互联网 发布:dsp算法大全c语言版本 编辑:程序博客网 时间:2024/06/16 23:33
在学习muduo库源码的时候在,base文件夹下的type.h有
#ifdef MUDUO_STD_STRINGusing std::string;#else // !MUDUO_STD_STRINGtypedef __gnu_cxx::__sso_string string;#endif
就想了解一下__sso_string和std::string 的区别:
主要参考了这篇博客:http://blog.csdn.net/kemawcz/article/details/52709747
我自己也进行了例子测试:编译器版本是GCC4.8.5 操作系统是centos7 IDE: eclipse Mars
因为这两种不同的字符串模式,涉及到了深拷贝和浅拷贝的问题。
首先测试了
__sso_string 短字符串情况
#include <iostream>#include <ext/vstring.h>using namespace std;typedef __gnu_cxx::__sso_string SSO_string;int main() { SSO_string str1 = "123456"; SSO_string str2(str1); cout<<"str1对象地址="<<(long int )&str1<<" str1C字符串地址"<<(long int )str1.c_str()<<endl; cout<<"str2对象地址="<<(long int )&str2<<" str2C字符串地址"<<(long int )str2.c_str()<<endl; return 0;}
运行结果:
str1对象地址=140734076030416 str1C字符串地址140734076030432
str2对象地址=140734076030448 str2C字符串地址140734076030464
发现短字符串的情况下,进行了深拷贝操作,而且内存分配位置很接近应该都是在栈上分配的内存。
然后测试一下比较长的字符串。
int main() { //SSO_string str1 = "123456"; SSO_string str1 = "11231dwadwfewfewfewfw=============dwfffffffffwaf3244444444444444455555543tttttttttttttttttttttdddddddddddddddddddddddddddddddddddddddddddddddddddddd"; SSO_string str2(str1); cout<<"str1对象地址="<<(long int )&str1<<" str1C字符串地址"<<(long int )str1.c_str()<<endl; cout<<"str2对象地址="<<(long int )&str2<<" str2C字符串地址"<<(long int )str2.c_str()<<endl; return 0;}
这个运行结果是:
str1对象地址=140729417014880 str1C字符串地址34193424
str2对象地址=140729417014912 str2C字符串地址34193584
同样进行了深拷贝操作,因为C字符串的地址不同,但是发现C字符串的地址和对象地址差距很大,应该是在堆上申请的内存。
那么接下来测试一下std::string
int main() { std::string str1 = "123456"; //std::string str1 = "11231dwadwfewfewfewfw=============dwfffffffffwaf3244444444444444455555543tttttttttttttttttttttdddddddddddddddddddddddddddddddddddddddddddddddddddddd"; std::string str2(str1); cout<<"str1对象地址="<<(long int )&str1<<" str1C字符串地址"<<(long int )str1.c_str()<<endl; cout<<"str2对象地址="<<(long int )&str2<<" str2C字符串地址"<<(long int )str2.c_str()<<endl; return 0;}
运行结果:
str1对象地址=140736195194224 str1C字符串地址29622312
str2对象地址=140736195194208 str2C字符串地址29622312
发现C字符串地址一样
我们再测试一下长度比较长的字符串:
int main() { //std::string str1 = "123456"; std::string str1 = "11231dwadwfewfewfewfw=============dwfffffffffwaf3244444444444444455555543tttttttttttttttttttttdddddddddddddddddddddddddddddddddddddddddddddddddddddd"; std::string str2(str1); cout<<"str1对象地址="<<(long int )&str1<<" str1C字符串地址"<<(long int )str1.c_str()<<endl; cout<<"str2对象地址="<<(long int )&str2<<" str2C字符串地址"<<(long int )str2.c_str()<<endl; return 0;}
运行结果:
str1对象地址=140731855771696 str1C字符串地址33902632
str2对象地址=140731855771680 str2C字符串地址33902632
依然是相同的,而且无论字符串长短,都应该是在堆上分配的内存。
那么根据上述博客中提到的COW实现方式:
int main() { //std::string str1 = "123456"; std::string str1 = "11231dwadwfewfewfewfw=============dwfffffffffwaf3244444444444444455555543tttttttttttttttttttttdddddddddddddddddddddddddddddddddddddddddddddddddddddd"; std::string str2(str1); cout<<"str1对象地址="<<(long int )&str1<<" str1C字符串地址"<<(long int )str1.c_str()<<endl; cout<<"str2对象地址="<<(long int )&str2<<" str2C字符串地址"<<(long int )str2.c_str()<<endl; str2[0] = 'c'; cout<<"修改操作之后======"<<endl; cout<<"str1对象地址="<<(long int )&str1<<" str1C字符串地址"<<(long int )str1.c_str()<<endl; cout<<"str2对象地址="<<(long int )&str2<<" str2C字符串地址"<<(long int )str2.c_str()<<endl; return 0;}
运行执行修改操作的代码发现:
str1对象地址=140724647839328 str1C字符串地址6565928
str2对象地址=140724647839312 str2C字符串地址6565928
修改操作之后======
str1对象地址=140724647839328 str1C字符串地址6565928
str2对象地址=140724647839312 str2C字符串地址6566120
str2被重新分配了内存
补充一下关于__sso_string的内存分配原则:
通过追踪代码发现,会对比字符串长度是不是超过一个值,这个值就是_S_local_capacity 设定的初始值是15
size_type __dnew = static_cast<size_type>(std::distance(__beg, __end)); if (__dnew > size_type(_S_local_capacity)) { _M_data(_M_create(__dnew, size_type(0))); _M_capacity(__dnew); }
enum { _S_local_capacity = 15 };
如果字符串长度超过15就会在堆上分配内存
- __sso_string与std::string的区别
- std::string 的length()与size()方法没有区别
- CString CStringA CStringW std::string std::wstring之间的区别与联系
- std::bind1st与std::bind2nd的区别
- std::vector<std::string>::size_type和 int的区别
- UnicodeToMultiByte,ConvertBSTRToString,std::string,CString的区别
- std::string 与 std::wstring 转换方法的效率比较
- 【读书笔记】std::string的基本操作 与字符串数组的区别
- wxString与std::string之间的转换
- TCHAR 与 STD::string 之间的若干问题
- wxString与std::string之间的转换
- TCHAR 与 STD::string 之间的若干问题
- QString与std::string的相互转换
- std::string 与 char* 之间的转换
- std::vector<string>的find();与erase();
- QString与std::string的相互转换
- QString与std::string的相互转换
- CEGUI的String与C++的std::string互相转换
- 第二周实践项目二
- 【Linux】在服务器上实现socket传输
- Java--平面图形M打印(通用版)
- 微信 "errcode": 85005, "errmsg": "appid not bind weapp hint: [tghx1a0557vr18]"
- 流运算符重载
- __sso_string与std::string的区别
- HDU 4370 0 or 1——spfa
- leetcode 108. Convert Sorted Array to Binary Search Tree
- 191. Number of 1 Bits
- golang 连接mysql 参数备忘
- 光环国际PMP:看项目经理与程序猿都是怎么吐槽绩效考核的(好文)
- uinavigationbar
- C/C++语言中函数参数传递的三种方式
- linux下改变命令行前缀