move-semantics 相关问题

移动语义是一种编程语言功能,当源对象是临时对象或其他过期对象时,允许复制操作被更有效的“移动”替换。

理解c++ move_constructible概念实现

我从 cppreference 得到了 C++ 概念 move_constructible 的以下实现 模板 概念 move_constructible = 可构造_from<_Tp, _Tp> &&...

回答 2 投票 0

显式声明模板参数时如何进行完美转发

考虑这个简单的函数 模板 自动 mkVector(U&& x0) { 返回 std::vector>{std::forward(x0)}; } 以及 4 个可能的用例...

回答 1 投票 0

嵌套std::vector的移动语义和时间复杂度<std::vector<std::string>>右值赋值

如果存在具有以下签名的函数: std::vector> some_func(); 并将其分配给相同类型的变量: std::向量 如果有具有以下签名的函数: std::vector<std::vector<std::string>> some_func(); 并将其分配给相同类型的变量: std::vector<std::vector<std::string>> var = some_func(); 这个赋值操作的时间复杂度是多少?明显的假设是,这将是一个移动赋值操作,并且比常规的逐元素复制到 var 更快。 但是我不确定移动赋值操作是否只会将外部向量的位置/大小信息移动到var并让内部向量的指针和大小信息相同,或者内部向量也会被移动逐个元素? 如果是这样的话,右值引用会更快吗? : std::vector<std::vector<std::string>>&& var = some_func(); std::vector<std::vector<std::string>> var = some_func(); 这个赋值操作的时间复杂度是多少。 没有赋值操作。 这不是赋值,而是复制初始化。 请参阅初始化和赋值有什么区别? 由于 some_func 按值返回 std::vector,因此从 some_func 返回的对象与 var 是同一个对象。 另请参阅保证复制省略如何工作? 在 C++17 之前,这最多就是对移动构造函数的一次调用,其复杂性恒定(请参阅 (8))。 如果是这样的话,右值引用会更快吗? : std::vector<std::vector<std::string>>&& var = some_func(); 不,这和var一样贵。 这具体化了 some_func() 返回的临时对象,但就像第一个示例一样,只有一个对象。 这段代码自 C++17 以来更加糟糕,因为它更复杂,但没有任何收获。 最后但并非最不重要的一点是,您很可能不需要 std::vector 向量。 这将是一个二维数据结构,其中每行可以有不同的长度,而这很少是可取的。 更简单的形式是单个 std::vector,包裹在 std::mdspan、std::views::chunk 等中。根据需要。

回答 1 投票 0

将多个不可复制的值插入到 `std::vector`

将 N 个值一一插入到 std::vector 中效率很低。 因此,您可以一次性插入它们。 我的问题是我的价值观不可复制构造。 所以,问题是我怎样才能制作

回答 1 投票 0

为什么使用 std::swap 而不是 std::move 作为(可选)输出值?

我正在查看 Microsoft 的代码,我注意到以下内容: 可选参数 std::vector* vOut 被传递到函数中。 该函数本身使用单独的本地 std::vector<...

回答 1 投票 0

将 `std::move` 与接收 const ref 的函数一起使用是个好主意吗?

这是一个可以编译并运行的代码片段: #包括 #包括 void print_str(const std::string& str) { std::cout << str << '\n'; } int main() { ...

回答 1 投票 0

关于std::string动作的实现

我正在研究移动 std::string 的性能。在很长一段时间里,我认为字符串移动几乎是免费的,认为编译器会内联所有内容,并且只涉及几个

回答 2 投票 0

NRVO 和 Move Semantics 可以在 C++ 中一起使用吗?

我正在从《C++ Move Semantics》一书中阅读有关 C++ 中的移动语义的内容。本书假设 NRVO 用于 createAndInsert() 函数的 return 语句。然而,它也指出移动语义...

回答 2 投票 0

std::move(*this) 是一个好的模式吗?

为了使带有 C++11 引用限定符的这段代码按预期工作,我必须引入一个听起来不对的 std::move(*this) 。 #包括 结构体A{ void Gun() const&...

回答 2 投票 0

我可以将 std::unique_ptr<T> 移动到 std::vector<T> 吗?

假设我有一个由一些通用 T 对象组成的向量: std::vector vector_of_ts = {...}; 该向量本质上是一个堆分配的 T 对象数组,在底层。现在,假设我有以下内容...

回答 1 投票 0

如何在 C++ 中返回字符串元组而不需要临时额外副本?

我的问题在本质上与避免额外的复制在从C++中的返回值创建元组时类似,但是因为我根本不理解答案并且因为我正在谈论标准ty...

回答 1 投票 0

何时对函数参数执行移动操作 c++

以为例 无效 f(B b, A&& a) {...} B g(B b, A a) {...} int main() { 乙b; 一个一个; f(g(b, a), std::move(a)); } 我认为这将是有效的代码,因为 std::move() 是

回答 2 投票 0

在链表中移动一个简单类的构造函数/赋值

我有一个简单的类,有一些简单的成员,并且没有分配。我计划添加一个移动构造函数/作业。这些原语不会比普通原语更有效。

回答 1 投票 0

字符串移动后,std::string::c_str()返回的数据仍然有效吗?

假设我有一个异步发送 const char * 数据的函数,并在发送数据或发生错误时调用回调(我省略了与问题无关的错误处理): 无效

回答 1 投票 0

关于 unique_ptr 行为与 std::move 的特定用法的问题

基于排序操作,以下代码在 C++20 中定义良好吗?或者它是否具有未定义的行为? #包括 #包括 使用命名空间 std; 结构体A { ...

回答 1 投票 0

为什么派生类可以移动构造,而基类则不能?

考虑以下示例: #包括 #包括 #包括 模板 struct Foo : public Base { 使用基::基; }; 结构...

回答 2 投票 0

关于返回值中复制构造函数的问题

这是来自于此的代码测试。 我将其中一些复制如下: //结构体定义。各类印刷品 struct Snitch { // 注意:所有方法都有副作用 告密者(){cout<< "...

回答 1 投票 0

哪些std类型在移动构造函数中用作arg后保证为空/null

我知道shared_ptr,unique_ptr,weak_ptr在用作相同类型的构造函数中的右值引用参数后保证为空,但我想知道标准是否为某些其他指定了这一点...

回答 2 投票 0

noexcept 对显式默认的移动构造函数/赋值运算符有影响吗?

C级 { 民众: C(C&&) = 默认值; // (1) C& 运算符=(C&&) = 默认; // (1) C(C&&) noexcept = 默认; // (2) C& 运算符=(C&...

回答 1 投票 0

EMC++ 中提到的“源对象是左值”场景是什么,其中移动语义没有提供任何效率增益

Effective Modern C++ 中的第 29 条,Scott Meyers 列出了移动语义不能提高代码性能的三种场景, [...]移动语义对你没有好处: 无移动操作:要成为的对象

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.