2015-04-22 37 views
3

我想提供零拷贝,基于移动的API。我想将一个字符串从线程A移动到线程B.意识形态上,似乎移动应该能够简单地通过\将实例A的数据移动到新的实例B中,并且最少或者不执行任何复制操作(主要用于地址)。因此,像数据指针这样的所有数据将被简单地复制,不会有新的实例(通过移动构建)。那么std :: std :: string上的移动保证.c_str()在移动实例前通过移动构造函数创建实例时返回相同的结果?std :: std :: string保证.c_str()返回相同的结果吗?

+5

复制整个执行'的std :: move'只是一个演员。它不*做任何事情。 –

+0

@MikeVine它可以显然不会被期望在变化之间返回相同的指针。例如,如果字符串大小是任意增加的。如果在标准中没有提到它,那么任何非const方法都可以自由地影响这个。 –

回答

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

+0

如何通过值将字符串放入unique_ptr.having中? – DuckQueen

+0

为您添加。 –

9

不需要std::string没有要求使用动态分配或做任何具体的分配,如果它有一个。实际上,现代实现通常将短的字符串放入字符串对象本身,并且不分配任何东西;那么移动与复制相同。

重要的是要记住std::string而不是一个容器,即使它看起来非常类似。容器比std::string的要素对其要素做出了更强的保证。

+0

因此,在例如std :: vector的情况下,我们保证有第一个指针指向移动后的同一个地方? – DuckQueen

+0

@DuckQueen:我不太确定。该标准表示移动后的目标容器与移动前的操作数具有相同的值,但这有点含糊。只有'swap'才表示没有容器元素被触摸。 –

7

不,不能保证。

保证它基本上禁止(例如)短字符串优化,其中一个短字符串的整个主体存储在字符串对象本身,而不是单独分配在堆上。至少目前为止,我认为SSO被认为是足够重要的,委员会会非常不情愿地禁止它(但这可能会改变 - 当原始的C++ 98标准被写入时,他们遇到了相当大的麻烦以允许写入时复制字符串,但现在禁止它们)。

相关问题