2016-08-21 55 views
1
int main() { 
    std::string str; 
    str.reserve(9999); 

    { 
     std::string s1("aaa"); 
     std::string s2("bbb"); 
     // can both strings s1, s2 be moved to str? 
     // for example str should be "aaabbb" 
    } 

} 

我的问题:是否有可能窃取的s1s2记忆形成的s1s2一个连接字符串(因为它已经有足够的空间用于两者)?移动字符串到另一个字符串中有足够的能力

+0

加运算符对于多个级联s1 + s2 + s3是昂贵的...... – mkmostafa

+0

对于C++ 11中的多级联而言,加运算符并不昂贵。 –

+0

@HowardHinnant你能详细解释一下吗?我所理解的是最后两个字符串将被添加到一个新字符串中,该字符串将在返回新字符串之前被添加到字符串中,等等。在这个问题之后,我看不到在中间使用任何移动操作的可能性。由于在添加到返回的字符串期间无法移动任何这些临时文件。我考虑实现遍历整个事物的表达式模板,并根据总大小构建一个字符串,然后一次预留容量和复制所有内容。 – mkmostafa

回答

1

因为用于std::string的内存必须是连续的,所以无法窃取两个独立字符串的内存。

从C++ 14,部分21.4.1/4:

在basic_string的对象的炭状物体将被连续地存储。也就是说,对于任何basic_string 对象s,身份&*(s.begin() + n) == &*s.begin() + n应该保持n的所有值,使得0 < = n < s.size()。

+1

@mkmostafa:'std :: list'有一个拼接操作,但它可能不是一个好选择,因为每个字符使用的内存量很大。 –

+0

基本上是因为std :: string是一个指向char的指针,它不能指向两个不同的字符指针(字符串在不同的内存位置)? – mkmostafa

+0

@mkmostafa:这并不完全准确,但它并不是一个不错的看待它的方式。 –

相关问题