2

次のクラスを受講します。

template <typename TPayload>
class Message
{
    public:
        Message(const TPayload& payload)
             : m_header(sizeof(TPayload)),
               m_payload(payload) {}

    private:
        const Header   m_header;
        const TPayload m_payload;
};

Message を作成するたびに、TPayload (パラメーター ペイロード) を作成し、これを m_payload にコピーしてから、ペイロードを破棄する必要があります。これは 1 秒間に何十万回も実行できると考えてください。これは無駄な作業だと思います。

私の質問は、一時的なペイロードを回避するために m_payload のインプレース構築を強制することはできますか?

私が検討している解決策の 1 つは、以下のように構造を何度もオーバーロードすることですが、正直なところ、複数の引数のすべてのコピーに多くの節約があるとは思えません。

template <typename TPayload>
class Message
{
    public:
        template <typename A>
        Message(const A& a)
             : m_header(sizeof(TPayload)),
               m_payload(a) {}

        template <typename A, typename B>
        Message(const A& a, const B& b)
             : m_header(sizeof(TPayload)),
               m_payload(a, b) {}

    private:
        const Header   m_header;
        const TPayload m_payload;
};
4

2 に答える 2

3

あなたが探しているのは、 のコンストラクターに与えられたコンストラクター引数の転送です。MessageMessage::m_payload

これは、C++11 できちんと行うことができます (可変個引数テンプレートとstd::forwardを使用して、std::vector<>::emplace_back()および他の多くの関数で使用されます)、または C++03 でいくつかのオーバーロードを使用して、作成を開始したり、使用したりできます。in boost::make_shared<>

例えば:

#include <iostream>
#include <string>
#include <utility>
typedef size_t Header;
template <typename TPayload>
class Message
{
    public:
        template <typename ...Args>
        Message(Args&&... args)
             : m_header(sizeof(TPayload)),
               m_payload(std::forward<Args>(args)...)
               {}
        void show_payload() const
        {
                std::cout << m_payload << '\n';
        }
    private:
        const Header   m_header;
        const TPayload m_payload;
};

int main()
{
     Message<std::string> test(10, 'a');
     test.show_payload();

     Message<double> test2(3.14);
     test2.show_payload();
}

テスト実行: https://ideone.com/J1JnZ

于 2011-04-19T15:57:17.403 に答える
2

また、C++ 11 では、パラメーターを値で受け入れてから、移動して構成することができます。

Message(TPayload payload)
    :m_header(sizeof(TPayload)),
     m_payload(std::move(payload)) {}

TPayload に適切に定義された有用なムーブ コンストラクタがあることを確認してください。そうしないと、あまり効果がありません。

于 2011-04-19T16:08:40.817 に答える