【发布时间】:2022-10-27 07:45:11
【问题描述】:
我想提供零拷贝、基于移动的 API。我想将一个字符串从线程 A 移动到线程 B。从意识形态上讲,似乎 move 应该能够简单地将数据从实例 A 传递\移动到新实例 B,而复制操作最少甚至没有(主要用于地址)。所以像数据指针这样的所有数据都将被简单地复制而不是新的实例(通过移动构造)。那么 std::move on std::string 是否保证 .c_str() 在移动之前的实例和通过移动构造函数创建的实例返回相同的结果?
【问题讨论】:
-
std::move只是演员。它没有做任何事物。 -
我不相信后续调用 .c_str() 一定会返回相同的指针即使没有尝试的举动。标准要求(即使是隐含的要求)将是一件奇怪的事情,尽管我希望语言律师引用我的标准。 (我知道它必须是真奇怪虽然这样做的实现)
-
@MikeVine 显然不能期望在更改之间返回相同的指针。例如,如果字符串大小被任意增加。如果标准中对此没有任何说明,那么任何非常量方法都可以自由影响它。
-
@Johan Lundberg 甚至都不是。我可以想到一个字符串实现(比如说一个将字符串存储两次的实现,我知道这很愚蠢,但我认为它符合标准)如果调用两次而不进行修改,它可以从 c_str() 返回一个不同的指针。至少我认为这没问题,但就像我说的那样,我希望看到标准中不允许这样做的内容。纯粹是为了兴趣。
-
C++ 标准库类和函数是线程安全的,因为它们允许在没有外部同步的情况下访问常量方法。 Const 方法被允许改变内部状态(可变的或丢弃 const),只有当它可以通过仍然保持正确的行为(原子或以其他方式同步,如果必须)或 as-if 来完成时。 herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable
标签: c++ c++11 move move-semantics