Linux下的string与Windows下的区别

string str1 = "sdfsdffdf";

string str2 = str1;

单这两句是看不出有什么区别的,但在不同系统下区别已经开始了!

分别打印string的存储数据的地址:

const char *p1 = str1.c_str();

const char *p2 = str2.c_str();

cout.unsetf( ios_base::dec );

cout.setf( ios_base::hex );

cout<<(int)p1< cout<<(int)p2< 现在区别明显了!

在Windows下输出是:

12ff4c

12ff14

在Linux下输出是:

2830104c

2830104c

现在看到区别了吧!在Linux下两个不同的字符串竟然是指向同一块内存,而Windows下是指向不同的内存!也就是说Windows下的是真正意义上的两个string字符串。而Linux的不是真正意义上的字符串?

为验证这点,在Linux下,在程序里面加多个下面这句:

transform (str2.begin(), str2.end(), str2.begin(), (int(*)(int))tolower); // #include

然后在输出指针所指的地址来看看:

cout<<(int)p1< cout<<(int)p2< 惊人的结果是:

2830104c

2830106c

对比一下前面的输出,发现第二个字符串的地址变了,什么时候变的?

经过实验发现,原来Linux下的string模板有点奸诈!比如对于最上面的两句程序,它会发现你并没有对strS2进行了实质性的操作,因为程序只是打印了一下地址而已,所以它就不给strS2分配空间来保存strS1的字符串!但它把strS2的指针指向了strS1的地址空间了!有点变态了。但如果在程序后面加多个对strS2进行操作的transform函数后会发现,系统给strS2分配了空间!对于这个本人有点郁闷,因为我写个C的函数对strS2进行操作,系统没给strS2分配空间!只能是g++在对strS2的空间分配的判断上,只能根据C++的操作函数,发现有使用了,然后才分配空间!

据说Linux下的这个特性是为了提高程序运行速度的!好像是。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzyjdw.html