这是有效的优化吗?

时间:2014-08-27 16:24:19

标签: c++ move-semantics

"Hello."是一个临时构造,被复制到std::string并随后被销毁。我们可以跳过复制并直接移动。但任何体面的编译器都会忽略副本。所以有以下几点:

std::string s(std::move("Hello."));

3 个答案:

答案 0 :(得分:3)

不,移动字符串文字是没有意义的。它是一个静态数组(不是一个“构造的临时”),它不能移动,只能被复制。

答案 1 :(得分:0)

如果这甚至是合法的,我不知道是不是,那就不是优化任何东西了。

文字在编译时在静态空间中创建。它无法移动。 string将始终拥有数据的副本,而不仅仅是“引用”它。

答案 2 :(得分:0)

您的代码没有多大意义,因为它在逻辑上与此相同:

Foo bar( std::move( 123 ) );

没有必要移动常量,字符串文字是常量。更好的问题是,我认为你的问题真正意味着什么:

class Foo { ... };

class Bar {
public:
    Bar( const Foo &foo );
    Bar( Foo &&foo );
...
};

Bar bar( std::move( Foo() ); // Does it make sense?

所以实际上对于这种情况std::move可以用作语法糖来避免表单的函数声明:

Bar bar( Foo() );

但它不会进行任何优化,在这种情况下:

Bar bar = std::move( Foo() );

这将是完全多余的