【发布时间】:2015-03-02 11:03:11
【问题描述】:
我发现了这段使用 memset() 初始化对象的 C++ 代码:
struct Message
{
Message()
{
memset(this, 0, sizeof(Message));
}
unsigned int a, b, c;
};
由于这是一个POD结构,这段代码应该没问题。
使用 memset 代替构造函数有什么好处,例如:
Message() : a(0), b(0), c(0) {}
【问题讨论】:
-
考虑如果你的对象有虚拟表指针会发生什么。好的编译器很可能会确定您有 POD 和
memset它们或在第二种情况下类似的东西。但是如果稍后决定建立一个层次结构,那你就搞砸了。 -
至少在 memset 之前/之后插入一个
static_assert。这告诉人类读者和编译器你假设 Message 是一个 POD;如果不是这样,编译器就会失败,读者就会知道为什么你认为 memset 没问题。 -
@leemes:类似于
static_assert(std::is_pod<Message>::value);。但是对于一个重要的默认构造函数,它永远不会是一个 POD,不是吗?也许它应该检查标准布局类型? -
我非常怀疑,
memset应该强制调用内存,它不会被优化,因为它会被认为有副作用。静态声明初始值为编译器提供了更多优化选项。 -
@leemes:那么我会选择:
static_assert(std::is_standard_layout<Message::value, "class is not memsettable")
标签: c++ constructor initialization memset