标签: stdmove

C++:我应该在return语句中明确使用std :: move()来强制移动吗?

编辑:它不是重复,因为这个问题询问编译器在O0中的决定.

据说这里是名称返回值优化(NRVO)是一个优化许多编译器的支持.但它是必须的还是只是一个很好的优化?

我的情况是,我想编译-O0(即没有优化),以方便调试,但我也希望NRVO启用返回对象(例如,向量)的返回语句.如果NRVO不是必须的,编译器可能不会在-O0模式下执行.在这种情况下,我应该更喜欢这个代码:

std::vector<int> foo() {
    std::vector<int> v(100000,1); // an object that is really big..
    return std::move(v);  // explicitly move
}
Run Code Online (Sandbox Code Playgroud)

在这下面?

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return v;    // copy or move?
}
Run Code Online (Sandbox Code Playgroud)

编辑:我使用的编译器是GCC6,但我希望代码与编译器无关.

c++ nrvo stdmove

1
推荐指数
1
解决办法
502
查看次数

我可以在返回多个值时避免复制,同时保留我的返回类型吗?

如果我们写如下函数:

auto foo() {
    Foo foo { /* ... */ };
    do_stuff(foo);
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

然后NRVO应该启动,这样foo就不会在返回时被复制。

现在假设我想返回两个不同的值:

auto foo() {
    Foo foo { /* ... */ };
    Bar bar { /* ... */ };
    do_stuff(foo, bar);
    return std::make_tuple(foo, bar);
}
Run Code Online (Sandbox Code Playgroud)

这种幼稚的实现可能会触发构建每个FooBar( GodBolt)的两个副本。

我应该如何最好地修改我的代码以避免这种复制,而不会弄乱我的返回类型?

c++ move-semantics copy-elision nrvo stdmove

1
推荐指数
1
解决办法
50
查看次数

从 std::list 中 std::move 元素后获得无效输出

我试图了解 std::move 。在我的代码中,我正在从内部包含两个字段的std::list<struct Data>位置移动一个元素,但我没有得到预期的输出。这是我的代码:struct Datastd::string

#include <iostream>
#include <string>
#include <list>

struct Data {
    std::string topic {};
    std::string msg {};

    Data(const std::string& topic, const std::string& msg) {
        this->topic = topic;
        this->msg = msg;
    }
};

int main() {
    std::list<Data> data_list;
    data_list.push_back(Data("A", std::string(1000, 'a')));
    data_list.push_back(Data("B", std::string(1000, 'b')));
    data_list.push_back(Data("C", std::string(1000, 'c')));
    data_list.push_back(Data("D", std::string(1000, 'd')));
    data_list.push_back(Data("E", std::string(1000, 'e')));
    
    while (!data_list.empty()) {
        std::cout << (void*)&data_list.front() << "\n";
        Data&& d1 = std::move(data_list.front());
        data_list.pop_front();
        std::cout << d1.topic << ", " << d1.msg …
Run Code Online (Sandbox Code Playgroud)

c++ stdlist stdmove

1
推荐指数
1
解决办法
63
查看次数

返回 std::move 具有 unique_ptr 成员的类

为什么我不能std::unique_ptr使用std::move语义(我认为)返回包含 , 的类,如下例所示?我认为 return 会调用 class 的 move ctor A,这将std::movestd::unique_ptr. (我使用的是 GCC 11.2,C++20)

例子:

#include <memory>

class A {
  public:
    explicit A(std::unique_ptr<int> m): m_(std::move(m)) {}
  private:
    std::unique_ptr<int> m_;
};

A makit(int num) {
    auto m = std::make_unique<int>(num);
    return std::move(A(m));  // error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'x86-64 gcc 11.2 #1
}

int main() {
    auto a = makit(42);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我相信解决方案是返回 …

c++ unique-ptr stdmove

1
推荐指数
1
解决办法
740
查看次数

为什么 std::move 在这种情况下会导致 SEGFAULT?

为什么std::move()在这种情况下会导致SEGFAULT?

#include <iostream>

struct Message {
    std::string message;
};

Message * Message_Init(std::string message) {
    Message * m = (Message*)calloc(1, sizeof(Message));
    m->message = std::move(message);
    return m;
}

int main() {
    auto m = Message_Init("Hello");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS请不要问为什么Message不以通常的 C++ 方式构造。

c++ std stdmove

1
推荐指数
1
解决办法
706
查看次数

无法使用std :: move将自定义删除器插入std :: unique_ptr

我使用std::unique_ptr自定义删除器作为a的值,std::map如下所示:

#include <iostream>
#include <memory>
#include <map>

void deleter(int* p){
    std::cout<<"Deleting..."<<std::endl;
    delete p;
}

int main()
{   
    std::map<char, std::unique_ptr<int, void(*)(int*)>> a;
    std::unique_ptr<int, void(*)(int*)> p{new int{3}, deleter}; 
    a['k'] = std::move(p);
}
Run Code Online (Sandbox Code Playgroud)

插入值时,我使用std::move,但不会编译.

我究竟做错了什么?

您会在链接后看到错误.

https://wandbox.org/permlink/fKL4QDkUTDsj4gDc

c++ stdmap unique-ptr stdmove

0
推荐指数
1
解决办法
279
查看次数

当我做int a = std :: move(b)(b也是int)时,它是否与a = b相同?

当我做int a = std :: move(b)(b也是int)时,它是否与a = b相同?

c++ stdmove

0
推荐指数
1
解决办法
73
查看次数

除非存在类对象的“空”(无参数)构造函数,否则将对象添加到 std::map 不起作用

我正在研究一个开源应用程序的代码。我制作了这段代码的一个更简单的版本,以隔离困扰我的问题(尽管我对这段代码有几个问题,我希望 C++ 专家能够帮助我,我将从主要问题开始)。

主要问题:为什么我需要一个“空”构造函数(无参数)来分配给 std::map 的对象类?

主要思想(参见下面的代码)是将 Variant 类的实例分配给 a std::map(其键是 a std::string)。这是代码:

#include <iostream>
#include <map>
#include <string>
#include <memory>

struct Data
{
public:
    Data(const void* data, size_t bytes) : bytes(bytes)
    {
        ptr = malloc(bytes);
        memcpy(ptr, data, bytes);
        std::cout << "in ctor of Data" << std::endl;
    }
    ~Data() { free(ptr); std::cout << "in dtor of Data" << std::endl; }
    void* ptr{ nullptr };
    size_t bytes;
};

struct DataStream 
{
public:
    DataStream(const std::shared_ptr<Data>& ptr, size_t size) : ptr(ptr), …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap stdmove

0
推荐指数
1
解决办法
328
查看次数

标签 统计

c++ ×8

stdmove ×8

nrvo ×2

stdmap ×2

unique-ptr ×2

copy-elision ×1

move-semantics ×1

std ×1

stdlist ×1