问题标题是不言自明的。我有一个需要动态大小数组的运行循环。但我确实知道这个大小的最大值,所以如果需要的话,我可以最大化它而不是动态调整大小。
这是我的代码,我知道clock_t在可移植性方面可能不是时序的最佳选择,但clock_t提供的准确性很差。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <ctime>
#define TEST_SIZE 1000000
using namespace std;
int main(int argc, char *argv[])
{
int* arrayPtr = NULL;
int array[TEST_SIZE];
int it = 0;
clock_t begin, end;
begin = clock();
memset(array, 0, sizeof(int) * TEST_SIZE);
end = clock();
cout << "Time to memset: "<< end - begin << endl;
begin = clock();
fill(array, array + TEST_SIZE, 0);
end = clock();
cout << "Time to fill: "<< end - begin << endl;
begin = clock();
for ( it = 0 ; it < TEST_SIZE ; ++ it ) array[it] = 0;
end = clock();
cout << "Time to for: "<< end - begin << endl;
}
这是我的结果:
Time to memset: 1590
Time to fill: 2334
Time to for: 2371
现在我知道新的&amp;删除现在将数组清零,有没有比这些更快的方法?
请帮助我!
答案 0 :(得分:3)
基本上你要比较苹果和橘子。
memset
并且for循环显式地将内存内容设置为特定值(示例中的 0
)。同时,new
仅分配足够的内存(至少按要求),而delete
仅标记内存可供重用。该内存的内容没有变化。因此new
和delete
不会初始化/取消初始化实际内存内容
从技术上讲,该内存中的内容具有 Indeterminate值 。从字面上看,价值观可能是任何东西,你不能依赖它们来做任何具体的事情。它们可能是0
,但它们并不能保证。实际上,使用这些值会导致程序出现 未定义行为 。
对课程进行new
调用会做两件事:
但请注意,在您的情况下,类型为int
,并且int
没有默认初始化。
答案 1 :(得分:2)
new
仅分配一个内存块,它不会初始化已分配的内存。
要初始化数组,您可以使用memset()
或手动执行此操作。
答案 2 :(得分:0)
好的编译器会将所有4种方法优化为memset
的1次调用。另外,3 rd 和4 th 方法之间有什么区别?
您也可以
int array[TEST_SIZE] = {};
获得可读性并保存1行代码。
答案 3 :(得分:0)
在这种情况下,我会诉诸memset
。 fill
是通用的,但该平台可以在memset
的实现中为您提供一些非常好的技巧。这是可能的,因为这个功能在它的功能和哑巴中是毫不含糊的: