Visual Studio下string::swap的复杂度

4

关于std :: basic_string :: swap cppreference页面表示它具有常数复杂度。我理解这意味着不能发生复制内容,只能交换指针或类似操作。我编写了一个测试代码,体验到在VS2010下确实会移动内容。测试代码:

std::string s1("almafa");
std::string s2("kortefa");
std::cout << "s1.c_str(): "<< (void*)s1.c_str() << std::endl;
std::cout << "s2.c_str(): "<< (void*)s2.c_str() << std::endl;
std::cout << "SWAP!" << std::endl;
s1.swap(s2);
std::cout << "s1.c_str(): "<< (void*)s1.c_str() << std::endl;
std::cout << "s2.c_str(): "<< (void*)s2.c_str() << std::endl;

在g++ 4.6.3上的输出:

s1.c_str(): 0x22fe028
s2.c_str(): 0x22fe058
SWAP!
s1.c_str(): 0x22fe058
s2.c_str(): 0x22fe028

在VS2010上的输出

s1.c_str(): 000000000022E2D0
s2.c_str(): 000000000022E320
SWAP!
s1.c_str(): 000000000022E2D0
s2.c_str(): 000000000022E320

这是标准的偏离还是有我不知道的事情发生了?


3
让这些字符串变得更长。 - Kerrek SB
1个回答

5

一些std::string的实现使用了短字符串优化:

来自std::string的实现方式是什么?:

这是一种“短字符串优化”(SSO)实现。在这个变体中,对象包含指向数据、长度、动态分配缓冲区的大小等常规指针。但如果字符串足够短,它将使用该区域来保存字符串,而不是动态分配缓冲区。

因此,在您的情况下进行交换会进行固定大小的复制,所以是O(1)。


我应该买一个 vector<char> :-) - Notinlist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接