aut*_*hir 7 c++ memory-management boost-asio move-semantics c++11
我们可以使用移动语义在堆栈上移动堆分配的对象吗?
#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();
});
}
Run Code Online (Sandbox Code Playgroud)
std::move不重定位对象.它移动了价值.(想想MOV R1, R2一些机器语言中的指令:它不会移动寄存器,只移动内容!或memmove库函数.这就是"移动"的意义,而不是复制或压缩垃圾收集器时发生的那种移动,这会导致对象驻留在不同的地址,同时保留其确切的标识,包括在机器的每个地方查找移动对象的每一个引用并更新它.
移动语义是C++中的一个新功能,它允许以不必保留旧值的方式复制对象.这对于不再需要旧对象的情况很有用,因为它可以更快.
例如,将矢量从一个移动std::vector<X>到另一个可以使源对象成为零长度向量,并且所有数据都可以在没有任何内存分配或复制的情况下移动.由于这个想法是没有使用旧的向量,所以它已被破坏为零长度并不重要.
没有理由为什么在不同存储位置(例如,自由存储("堆")到自动存储("堆栈")之间不能工作,因为这些操作数之间的复制构造在C++中一直运行良好.
| 归档时间: |
|
| 查看次数: |
1956 次 |
| 最近记录: |