c++ - 我可以防止对非 POD 类中的数组数据成员中的元素进行零初始化吗?

标签 c++ arrays constructor initialization

非 POD 派生类 PayloadMessage 包含一个数组数据成员 (_payload),其元素似乎在构造时初始化为零。出于性能/效率原因,我不希望发生这种情况——它是一个大数组。建议? (可能是新位置?)我使用的是旧版 g++ 编译器 3.4.6。

#include <iostream>
class BaseMessage {
public:
  enum CCC_MessageType {  START_THREAD, KILL_THREAD };
  CCC_MessageType _type;
  virtual ~BaseMessage() {}  // class has other non-POD class stuff
};
class PayloadMessage : public virtual BaseMessage {
public:
  uint16_t _payload_length;
  uint8_t  _payload[3000];
};
int main(int argc, char* argv[]) {
  PayloadMessage* m = new PayloadMessage;
  size_t i = 0;
  for(; i < 3000; i++) { 
    std::cout << ' ' <<  static_cast<int>(m->_payload[i]); // all zeros, not what I want
  }
}

编辑: 好的,根据评论/答案和一些测试(如下所示),数组未被初始化。 (有谁知道可能导致内存似乎被清零的原因是什么?)

为了性能测试,我将 main() 更改为以下内容:

int main(int argc, char* argv[]) {
  PayloadMessage* m = new PayloadMessage;
  size_t i = 0;
  for(; i < 1400000; i++) {  // allocates just under 4GB, for 32-bit compatibility
    m = new PayloadMessage;
  }
}

然后编译并运行定时测试:

$ g++ -O3 test.cpp
$ time ./a.out
real    0m7.068s
user    0m1.393s
sys     0m4.730s

然后我添加了一个构造函数来为 _payload 进行显式值初始化并再次运行测试:

PayloadMessage() : _payload() {}

$ g++ -O3 test.cpp
$ time ./a.out
real    0m10.361s
user    0m3.582s
sys     0m5.797s

是的,具有显式初始化的第二个版本需要更长的时间,所以我假设第一个版本没有进行初始化(看起来就是那样)。感谢大家的帮助。

最佳答案

POD 仅在使用()(C++ 标准中的8.5)时才显式初始化值,否则默认初始化。 POD 的默认初始化意味着它不会对内存做任何事情。如果 operator new 返回零初始化内存,则 PayloadMessage 的构造函数不会做任何额外的工作。出于好奇,您是否检查了 PayloadMessage 的构造函数的反汇编以确定它是否真的在做任何昂贵的事情?

关于c++ - 我可以防止对非 POD 类中的数组数据成员中的元素进行零初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4167662/

相关文章:

c++ - 使用 g++ 链接我的程序

c++ - 旋转二维整数数组

arrays - 如何在 Kotlin 中将没有空格的字符串拆分为整数数组?

php - MySQL SELECT where IN (关联数组[key]) AND SUM(Col5) IN >= (数组[key2])

javascript - 在 html 中显示嵌套的 json 对象

c++ - 阿克曼表生成器

c++ - 改进的观察者设计模式 C++

python - 修改工厂函数中的不可变对象(immutable对象)

c++ - 将 make_shared 与 protected 构造函数 + 抽象接口(interface)一起使用

c++ - 在 C++ 中用更少的参数调用构造函数