【发布时间】:2011-08-08 19:29:42
【问题描述】:
参加以下课程:
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<Foo>(Foo(bar)),优化器将消除冗余副本,并应有效地“就地”构造对象。我对此不是 100% 确定的。如果我错了,我肯定会被揍。
标签: c++ construction in-place