我希望提供零拷贝、基于移动的API。我想将一个字符串从A线程移动到B线程。在理念上,移动应该能够简单地将数据从实例A传递/移动到新的实例B,最小化或不进行任何复制操作(主要是地址)。因此,所有的数据指针等数据将被简单地复制,而不是通过移动构造函数构造新的实例。那么,std::string上的std::move是否保证在移动之前的实例和通过移动构造函数创建的实例上.c_str()返回相同的结果?
我希望提供零拷贝、基于移动的API。我想将一个字符串从A线程移动到B线程。在理念上,移动应该能够简单地将数据从实例A传递/移动到新的实例B,最小化或不进行任何复制操作(主要是地址)。因此,所有的数据指针等数据将被简单地复制,而不是通过移动构造函数构造新的实例。那么,std::string上的std::move是否保证在移动之前的实例和通过移动构造函数创建的实例上.c_str()返回相同的结果?
不需要使用动态分配,也没有任何特定的动态分配要求。实际上,现代的实现通常将短字符串存储在string对象内,不分配任何内容;然后移动操作与复制相同。
需要记住的是,std::string
虽然看起来很像容器,但它实际上不是一个容器。容器对于其元素有比std::string
更强的保证。
swap
中才明确表示不会触及任何容器元素。 - Kerrek SB不需要,但如果需要,一种选择是将字符串放入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;
}
auto u_str = std::unique_ptr<std::string>(new std::string(ss));
std::move
只是一种类型转换,它本身并不会执行任何操作。 - Kerrek SB