gpt4 book ai didi

c++ - 堆分配的对象可以在堆栈上 move 吗?

转载 作者:可可西里 更新时间:2023-11-01 18:29:43 24 4
gpt4 key购买 nike

问题

我们可以使用 move 语义在堆栈上 move 分配给堆的对象吗?

例子

#include <boost/asio.hpp>
#include <memory>

class connection
{
public:
connection(boost::asio::ip::tcp::socket&& socket);

void start();

private:
boost::asio::ip::tcp::socket m_socket;
};

class server
{
public:
// Not relevent here

private:
void accept();

boost::asio::io_service m_io_service;
boost::asio::ip::tcp::acceptor m_acceptor;
};

void server::accept()
{
auto socket = new boost::asio::ip::tcp::socket(m_io_service);

m_acceptor.async_accept(*m_socket,
[&, socket](const boost::system::error_code& error)
{
if (!error)
{
auto connection = std::make_shared<connection>(std::move(*socket));
connection->start();
}

accept();
});
}

最佳答案

std::move不会重新定位对象。它 move 了值(value)。 (想想一些机器语言中的 MOV R1, R2 指令:它不 move 寄存器,只 move 内容!或者 memmove 库函数。这是“move ”的感觉,而不是复制或压缩时发生的那种 move 垃圾收集器,这会导致一个对象驻留在不同的地址,同时保留其确切的身份,这涉及到在机器的任何地方找到对 move 对象的每个引用并更新它)。

move 语义是 C++ 中的一项新功能,它允许以不必保留旧值的方式复制对象。这在不再需要旧对象的情况下很有用,因为它可以更快。

例如,从 std::vector<X> move 一个 vector 到另一个可能导致源对象成为零长度 vector ,并且所有数据在没有任何内存分配或复制的情况下 move 。由于想法是不使用旧 vector ,因此它已被破坏为零长度并不重要。

鉴于 C++ 中此类操作数之间的复制构造在不同存储(例如,自由存储(“堆”)到自动存储(“堆栈”)中的位置之间始终可以正常工作,因此没有理由不能在不同存储中的位置之间工作。

[编辑 2020]

但是,如果我们将一个对象从堆中移到其他地方,就会出现问题。堆中的旧内存只是被丢弃,没有任何破坏。那个内存不再是一个对象;要再次使用它,我们必须将一个对象 move 或构造到其中。否则,我们应该删除它(以低级方式,不调用析构函数)。

关于c++ - 堆分配的对象可以在堆栈上 move 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com