vector string 是用来取代数组的, 绝大部分时候,当你想new数组的时候,都要考虑用vector 或者string来替代.
只有一种情况要慎重考虑是否使用string. 当string实现是带引用计数的,并且你是在多线程中使用string. 这时候如果引用计数在多线程下面的性能已经不满足程序的要求,这时候要考虑用vector<char> 来替换这种string. 当然如果string本身并不带引用计数,那就没有什么问题了.
这里需要更正并强调一下,c++11以后string的实现是不带引用计数。也没有COW计数。COW即copy to write。
要确认string是否带引用计数,或者是否带COW技术。用下面的代码简单试一下就知道了
int main()
{
string s1 = "hellol";
string s2 = s1;
printf("s1 address %x\n", s1.c_str());
printf("s2 address %x\n",s2.c_str()));
s1[1] = 'q';
s2[1] = 'w';
printf("s1 address %x\n", s1.c_str());
printf("s2 address %x\n",s2.c_str()));
return 0;
如果带引用计数,那么在s2=s1代码之后,他们的地址应该是一样的,只不过s1的字符串资源引用次数+1。 当某个引用要修改数据的时候,这时候就不能共享了,编译器会遵循COW规则,先完整拷贝一份出来,原来的资源使用计数减一。然后在拷贝出来的资源上去修改。此时再打印s1和s2的资源地址,他们已经不一样了。这种实现存在一些隐藏的问题。c++11以后已经不这样实现了。
网友评论