Opened 9 years ago

Closed 9 years ago

#8624 closed Bugs (fixed)

Large objects passed by value

Reported by: Richard <legalize@…> Owned by: chris_kohlhoff
Milestone: To Be Determined Component: asio
Version: Boost 1.52.0 Severity: Optimization
Keywords: Cc:

Description

In asio/detail/reactive_socket_service_base.hpp:

198  template <typename ConstBufferSequence, typename Handler>
199  void async_send(base_implementation_type& impl,
200      const ConstBufferSequence& buffers,

CID 10918 (#1-5 of 5): Big parameter passed by value (PASS_BY_VALUE)
pass_by_value: Passing parameter handler of type
    boost::asio::detail::write_op<
        boost::asio::basic_stream_socket<
            boost::asio::ip::tcp,
            boost::asio::stream_socket_service<boost::asio::ip::tcp>
        >,
        boost::asio::mutable_buffers_1,
        boost::asio::detail::transfer_all_t,
        boost::asio::ssl::detail::io_op<
            boost::asio::basic_stream_socket<
                boost::asio::ip::tcp,
                boost::asio::stream_socket_service<boost::asio::ip::tcp>
            >,
            boost::asio::ssl::detail::write_op<
                boost::asio::detail::consuming_buffers<
                    boost::asio::const_buffer,
                    std::vector<boost::asio::const_buffer>
                >
            >,
        boost::asio::detail::write_op<
            boost::asio::ssl::stream<
                boost::asio::basic_stream_socket<
                    boost::asio::ip::tcp,
                    boost::asio::stream_socket_service<boost::asio::ip::tcp>
                >
            >,
            std::vector<boost::asio::const_buffer>,
            boost::asio::detail::transfer_all_t,
            boost::function2<void, boost::system::error_code const &, unsigned long>
            >
        >
    > (size 256 bytes) by value. 
201      socket_base::message_flags flags, Handler handler)
202  {

Same for async_receive.

In asio/handler_invoke_hook.hpp:

61 template <typename Function>

CID 10407 (#1-12 of 12): Big parameter passed by value (PASS_BY_VALUE)
pass_by_value: Passing parameter function of type
    boost::asio::detail::binder2<
        boost::asio::detail::write_op<
            boost::asio::basic_stream_socket<
                boost::asio::ip::tcp,
                boost::asio::stream_socket_service<boost::asio::ip::tcp>
            >,
            std::vector<boost::asio::const_buffer>,
            boost::asio::detail::transfer_all_t,
            boost::function2<void, boost::system::error_code const &, unsigned long>
        >,
        boost::system::error_code, unsigned long
    > (size 136 bytes) by value. 

62 inline void asio_handler_invoke(Function function, ...)

In asio/impl/write.hpp:

548  template <typename AsyncWriteStream, typename ConstBufferSequence,
549      typename CompletionCondition, typename WriteHandler>
550  inline write_op<AsyncWriteStream, ConstBufferSequence,
551      CompletionCondition, WriteHandler>
552  make_write_op(AsyncWriteStream& s, const ConstBufferSequence& buffers,

CID 10920 (#1-3 of 3): Big parameter passed by value (PASS_BY_VALUE)
pass_by_value: Passing parameter handler of type
    boost::asio::ssl::detail::io_op<
        boost::asio::basic_stream_socket<
            boost::asio::ip::tcp,
            boost::asio::stream_socket_service<boost::asio::ip::tcp>
        >,
        boost::asio::ssl::detail::write_op<
            boost::asio::detail::consuming_buffers<
                boost::asio::const_buffer,
                std::vector<boost::asio::const_buffer>
            >
        >,
        boost::asio::detail::write_op<
            boost::asio::ssl::stream<
                boost::asio::basic_stream_socket<
                    boost::asio::ip::tcp,
                    boost::asio::stream_socket_service<boost::asio::ip::tcp>
                >
            >,
            std::vector<boost::asio::const_buffer>,
            boost::asio::detail::transfer_all_t,
            boost::function2<void, boost::system::error_code const &, unsigned long>
        >
    > (size 224 bytes) by value. 

553      CompletionCondition completion_condition, WriteHandler handler)
554  {
555    return write_op<AsyncWriteStream, ConstBufferSequence, CompletionCondition,
556      WriteHandler>(s, buffers, completion_condition, handler);
557  }

Change History (1)

comment:1 by chris_kohlhoff, 9 years ago

Resolution: fixed
Status: newclosed

Fixes on trunk in [85749] and [85763]. Merged to release in [85838].

N.B. some copies are unavoidable in C++03 due to the need to obtain a non-const handler object. In C++11 most of these instances can use move construction rather than copy construction.

Note: See TracTickets for help on using tickets.