2013-04-26 8 views
5

Im ASIO HTTP Server 3 example gibt es Code wie folgt:Warum verwendet dieses ASIO-Beispiel members-Variablen, um den Status zu übergeben und nicht bind?

void server::start_accept() 
{ 
    new_connection_.reset(new connection(io_service_, request_handler_)); 
    acceptor_.async_accept(new_connection_->socket(), 
     boost::bind(&server::handle_accept, this, 
     boost::asio::placeholders::error)); 
} 

void server::handle_accept(const boost::system::error_code& e) 
{ 
    if (!e) 
    { 
    new_connection_->start(); 
    } 

    start_accept(); 
} 

Wesentlichen new_connection_ Mitglied der server Klasse ist und verwendet wird, um eine Verbindung start_accept-handle_accept passieren. Jetzt bin ich neugierig, warum new_connection_ als Member-Variable implementiert ist.

Würde es nicht auch funktionieren, die Verbindung mit bind statt einer Mitgliedsvariablen zu übergeben? Wie folgt:

void server::start_accept() 
{ 
    std::shared_ptr<connection> new_connection(new connection(io_service_, request_handler_)); 
    acceptor_.async_accept(new_connection_->socket(), 
     boost::bind(&server::handle_accept, this, 
     boost::asio::placeholders::error), 
     new_connection); 
} 

void server::handle_accept(boost::system::error_code const& error, std::shared_ptr<connection> new_connection) 
{ 
    if (!error) { 
    new_connection->start(); 
    } 
    start_accept(); 
} 

Wenn ja, warum verwendet das Beispiel Elementvariablen? Soll das Kopieren vermieden werden?

(Anmerkung: Ich bin nicht zufrieden mit ASIO noch und so kann es ein fundamentales Missverständnis hier)

Antwort

4

Vorbei an der Buchse Variable innerhalb einer Funktion erstellt mit std::bind ist mehr oder weniger das gleiche wie es als einen Halt Elementvariable in der Klasse http::server3::server. Mit bind wird create temporaries während der Verwendung der Member-Variable nicht. Ich denke nicht, dass das ein großes Problem ist, da die std::shared_ptr nicht schrecklich teuer zu kopieren ist, noch ist dieser Codepfad in dem Beispiel ein leistungskritischer Abschnitt.

Wenn ich meine eigenen Anwendungen schreibe, benutze ich beide Techniken. Wenn die asynchrone Aufrufkette sehr lang ist, werde ich die Variablen typischerweise als Mitglieder behalten, um die Funktionssignaturen des Handlers zu vereinfachen und Codewiederholung zu verhindern. Bei kürzeren Aufrufketten ist es leichter, die Logik des Codes zu verstehen, wenn die Zustandsvariablen im Funktor beibehalten werden, der aus bind erstellt wurde.

+2

Ich benutze oft beide Techniken und folge dem gleichen Ansatz wie Sam. Wenn ein Typ teuer zu kopieren ist oder die Variable in mehreren Ketten verwendet wird, verwende ich lieber eine Elementvariable, unabhängig von der Länge oder Einfachheit der einzelnen Aufrufketten. –

Verwandte Themen