【发布时间】:2010-11-12 18:03:40
【问题描述】:
非 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
}
}
编辑:好的,根据 cmets/answers 和一些测试(如下所示),数组没有被初始化。 (有谁知道是什么原因导致内存显示为零?)
为了进行性能测试,我将 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
是的,带有显式初始化的第二个版本需要更长的时间,所以我假设第一个版本没有进行初始化(看起来就是这样)。谢谢大家的帮助。
【问题讨论】:
-
我得问问。 真的会导致性能损失吗?您是否对其进行了分析以确定?
-
你确定缓冲区真的被零初始化了吗?它不应该。您是否尝试开启高优化(可能是 -O3)?
-
如果你得到的都是零,那纯属巧合,除非它是一些调试选项。
-
当
PayloadMessage在命名空间范围内定义或作为本地/类静态时,缓冲区仅初始化为零。 -
@caveman,感谢您的分析想法(应该想到这一点)。
标签: c++ arrays constructor initialization