非 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/