我想提供零拷贝,基于移动的API。我想将一个字符串从线程A移动到线程B.意识形态上,似乎移动应该能够简单地通过\将实例A的数据移动到新的实例B中,并且最少或者不执行任何复制操作(主要用于地址)。因此,像数据指针这样的所有数据将被简单地复制,不会有新的实例(通过移动构建)。那么std :: std :: string上的移动保证.c_str()在移动实例前通过移动构造函数创建实例时返回相同的结果?std :: std :: string保证.c_str()返回相同的结果吗?
回答
没有,
但如果需要,一种选择是把字符串中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.:
如何通过值将字符串放入unique_ptr.having中? – DuckQueen
为您添加。 –
不需要std::string
没有要求使用动态分配或做任何具体的分配,如果它有一个。实际上,现代实现通常将短的字符串放入字符串对象本身,并且不分配任何东西;那么移动与复制相同。
重要的是要记住std::string
是而不是一个容器,即使它看起来非常类似。容器比std::string
的要素对其要素做出了更强的保证。
因此,在例如std :: vector的情况下,我们保证有第一个指针指向移动后的同一个地方? – DuckQueen
@DuckQueen:我不太确定。该标准表示移动后的目标容器与移动前的操作数具有相同的值,但这有点含糊。只有'swap'才表示没有容器元素被触摸。 –
不,不能保证。
保证它基本上禁止(例如)短字符串优化,其中一个短字符串的整个主体存储在字符串对象本身,而不是单独分配在堆上。至少目前为止,我认为SSO被认为是足够重要的,委员会会非常不情愿地禁止它(但这可能会改变 - 当原始的C++ 98标准被写入时,他们遇到了相当大的麻烦以允许写入时复制字符串,但现在禁止它们)。
- 1. 的std :: string :: c_str()和临时
- 2. 深拷贝std :: string :: c_str()char *
- 3. std :: string :: c_str()覆盖函数返回的前一个
- 4. std :: string :: c_str和std :: string :: data有什么区别?
- 5. 是否std :: string :: c_str()总是返回一个以null结尾的字符串?
- 6. 从dll返回std :: string/std :: list
- 7. visual studio 2008 sp1 std :: string :: c_str()err
- 8. 回报的std ::矢量<std::string>返回垃圾
- 9. 为什么的std :: CBEGIN返回相同类型的std ::开始
- 10. 是以'/ 0'结尾的std :: string吗?
- 11. “std :: string const”与“const std :: string”
- 12. std :: async保证被调用返回void的函数吗?
- 13. 返回的std :: string与载体
- 14. 将ptr传递给返回的std :: string
- 15. std :: string返回不合适的值
- 16. 这相当于一个std :: string吗?
- 17. std :: string.c_str()与std :: string有不同的值吗?
- 18. std :: move结果切片吗?
- 19. std :: string替换不保留结束?
- 20. 多个std ::字符串临时导致相同的c_str指针
- 21. `std :: string :: iterator`保证不是指向char的指针吗?
- 22. 不存在从std :: string到std :: string的suiteble转换函数吗?
- 23. std :: string ::迭代器偏移和返回
- 24. 从std :: string向量返回char
- 25. `std :: string :: substr`返回无效指针?
- 26. C++ std :: string :: find总是返回npos?
- 27. 临时std :: string返回垃圾
- 28. 返回std :: vector <std::string>,但有时只有
- 29. 为什么std :: runtime_error :: what()返回const char *而不是std :: string const&
- 30. C++循环std :: vector <std :: map <std :: string,std :: string>>
复制整个执行'的std :: move'只是一个演员。它不*做任何事情。 –
@MikeVine它可以显然不会被期望在变化之间返回相同的指针。例如,如果字符串大小是任意增加的。如果在标准中没有提到它,那么任何非const方法都可以自由地影响这个。 –