问题
我们能否使用移动语义将堆上分配的对象移到栈上?
示例
#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::vector<BigClass>
移动时,不是每个BigClass
实例都被复制到新向量中,而是每个实例的地址都被复制到新向量中;这很快,因为你不必复制每个可能很大的BigClass
。这正确吗? - Raystd::vector
实际上是将底层的内存分配移动到另一个实例,这样另一个向量现在拥有引用的内存,而原始实例不再拥有任何东西。虽然第一个实例被移动后的状态取决于特定容器类型,但您仅保证它仍然可以在之后被销毁或重新分配,而不能保证它会变为空或任何其他可用状态。 (除非规范明确说明)。 - Ext3h