我的问题的关键在于,当在 C++ 中分配基本类型的动态数组时,其默认值被初始化为零,例如:
int* array = new int[size];
将创建一个动态的size零数组。
有几个问题:
new[]当使用没有显式初始化器的运算符时,C++ 标准是否保证动态分配的数组的元素将初始化为零?- 动态数组分配的各种实现中的程序是否花费时间将元素初始化为零?
- 如果我关心最大性能并计划立即覆盖所有数组元素,是否有一种方法可以在 C++ 中分配动态数组,从而避免初始化时间?
我的问题的关键在于,当在 C++ 中分配基本类型的动态数组时,其默认值被初始化为零,例如:
int* array = new int[size];
将创建一个动态的size零数组。
有几个问题:
new[]当使用没有显式初始化器的运算符时,C++ 标准是否保证动态分配的数组的元素将初始化为零?
默认情况下该数组是垃圾。在特定的实现中,那里可能有零,因为:
零可能是偶然出现的,作为堆管理器的副产品或作为旧数据;
在调试模式下,分配的块可以用零填充;这不应在发布中发生;
在调试模式下,堆内存段用零填充;
当进程从操作系统接收内存时,该页面将被填充为零(数据保护)。
为了防止所有这些原因影响您,您需要编译一个发布并运行将重复使用堆中内存的代码。例如这样:
PS该程序具有未定义的行为。事情应该是这样的——我们正在寻找未初始化数据中的垃圾。