c++ - 通过构造函数就地构造成员变量

标签 c++ construction in-place

参加以下类(class):

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;
};

每当我构造一条消息时,我都必须创建一个 TPayload(参数有效负载),将其复制到 m_payload 中,然后析构有效负载。现在考虑一下每秒可以完成 100'000 次,我认为这是浪费精力。

我的问题是,我可以强制 m_payload 就地构造以避免临时有效负载吗?

我正在考虑的一个可能的解决方案是多次重载构造,如下所示,但说实话,对于多个参数的所有复制,我怀疑是否可以节省很多。

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;
};

最佳答案

您正在寻找的是转发Message 的构造函数参数到 Message::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

关于c++ - 通过构造函数就地构造成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719093/

相关文章:

c++ - valarray 就地操作给出与临时赋值不同的结果

c++ - 包含 <chrono> 时出错

c++ - 有什么办法可以分离从 getcontext() 获得的上下文堆栈吗?

c++ - 如何在工厂设计中支持多个构造签名?

java - 使用 java.net.URL 在 java 中构建不正确的 URL?

matlab - matlab中的就地快速排序

c++ - C/C++ 一次读取一行

c++ - 为 C++ 项目创建一个简单的 GUI

algorithm - 如何构建堆的时间复杂度为 O(n)?

algorithm - Strassen算法的就地实现?