Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否在构造函数中初始化对象? 我发现了一个使用MeMSET()来初始化对象的C++代码: struct Message { Message() { memset(this, 0, sizeof(Message)); } unsigned int a, b, c; };_C++_Constructor_Initialization_Memset - Fatal编程技术网

是否在构造函数中初始化对象? 我发现了一个使用MeMSET()来初始化对象的C++代码: struct Message { Message() { memset(this, 0, sizeof(Message)); } unsigned int a, b, c; };

是否在构造函数中初始化对象? 我发现了一个使用MeMSET()来初始化对象的C++代码: struct Message { Message() { memset(this, 0, sizeof(Message)); } unsigned int a, b, c; };,c++,constructor,initialization,memset,C++,Constructor,Initialization,Memset,因为这是一个POD结构,所以该代码应该是正确的。 使用memset而不是构造函数是否有任何优势,例如: Message() : a(0), b(0), c(0) {} 像这样使用memset()没有任何好处。撇开所有明显的缺点和未来的痛苦不谈,有一个缺点使它的效率不如以前 Message() : a(0), b(0), c(0) {} 这是因为PODs通常存储在数组中。因此,好的(智能的)编译器将有一个优势,可以用一个memset()替换数组中多个对象的初始化,以防 Message * me

因为这是一个POD结构,所以该代码应该是正确的。
使用memset而不是构造函数是否有任何优势,例如:

Message() : a(0), b(0), c(0) {}

像这样使用
memset()
没有任何好处。撇开所有明显的缺点和未来的痛苦不谈,有一个缺点使它的效率不如以前

Message() : a(0), b(0), c(0) {}
这是因为
POD
s通常存储在数组中。因此,好的(智能的)编译器将有一个优势,可以用一个
memset()
替换数组中多个对象的初始化,以防

Message * messages_1 = new Message[100];

std::向量消息2;
消息2.调整大小(100);

即使只构造一个对象,好的编译器也会在幕后使用
memset()

请注意,在C++11及更新版本中,您有一个比以下任何一个更好的选项:

struct Message
{
   unsigned int a = 0;
   unsigned int b = 0;
   unsigned int c = 0;
};
这将产生与采用初始化列表方法的建造商相同的代码(和优化机会),同时:

  • 使用更少的代码
  • 更具可读性
  • 无需担心在添加成员时更新初始化列表
  • 如果以后
    b
    需要默认设置为
    -1
    ,则无需考虑该怎么办

考虑如果对象具有虚拟表指针会发生什么情况。好的编译器很可能会确定您有POD和
memset
它们,或者在第二种情况下有类似的东西。但是如果你以后决定建立一个层次结构,你就搞错了。至少在memset之前/之后插入一个
static\u assert
。这告诉人类读者和编译器,您假设消息是一个POD;如果不是,编译器将失败,读者将知道为什么您认为memset是可以的。@leemes:static\u assert(std::is\u pod::value)之类的东西。但是有了一个非平凡的默认构造函数,它就永远不会是一个POD,不是吗?也许它应该检查一个标准的布局类型?我非常怀疑,
memset
应该强制执行对内存的调用,这不会被优化,因为它会被认为有副作用。静态声明初始值为编译器提供了更多优化选项。@leems:然后我会选择:
static\u assert(std::是否为标准布局memset方法在填充字节中具有确定性0值方面确实有一个优势。有时这很重要,可能对于将其作为数据块而不是对象读取的哈希函数来说。
struct Message
{
   unsigned int a = 0;
   unsigned int b = 0;
   unsigned int c = 0;
};