std :: move on std :: string garantee:.c_str()返回相同的结果吗?

时间:2015-04-22 19:06:47

标签: c++ c++11 move move-semantics

我想提供零拷贝,基于移动的API。我想将一个字符串从线程A移动到线程B.在意识形态上,似乎移动应该能够简单地将数据从实例A传递到新实例B中,具有最小到无复制操作(主要用于地址)。因此,所有数据如数据指针都将被简单地复制而不是新实例(通过移动构造)。那么std :: move on std :: string garantee是什么.c_str()在移动之前在实例上返回相同的结果,并通过移动构造函数创建实例?

3 个答案:

答案 0 :(得分:10)

没有。 std::string不要求std::string使用动态分配,也不要求具有此类分配的任何特定内容(如果有)。事实上,现代实现通常会将短字符串放入字符串对象本身并且不会分配任何内容;然后移动与复制相同。

重要的是要记住,std::string 不是一个容器,即使它看起来非常类似于容器。与{{1}}相比,容器对其元素提供了更强的保证。

答案 1 :(得分:7)

不,这不能保证。

保证它基本上禁止(例如)短字符串优化,其中短字符串的整个主体存储在字符串对象本身中,而不是在堆上单独分配。

至少目前,我认为SSO被认为是非常重要的,委员会将非常不愿意禁止它(但这可能会改变 - 当原来的C ++ 98标准被编写时,他们遇到了相当大的麻烦允许写时复制字符串,但现在禁止它们。)

答案 2 :(得分:3)

没有

但是如果需要,可以选择将字符串放在std::unique_ptr中。就个人而言,我通常不会依赖c_str()值超过本地范围。

示例,请求:

#include <iostream>
#include <string>
#include <memory>

int main() {
    std::string ss("hello");
    auto u_str = std::make_unique<std::string>(ss);
    std::cout << u_str->c_str() <<std::endl;
    std::cout << *u_str <<std::endl;
    return 0;
}

如果你没有make_unique(C ++ 14中的新功能)。

auto u_str = std::unique_ptr<std::string>(new std::string(ss));

或者只是从proposal by S.T.L.:

复制整个实现

Ideone example on how to do that