将阵列归零的速度最快?

时间:2013-03-30 14:07:23

标签: c++ arrays memory optimization

问题标题是不言自明的。我有一个需要动态大小数组的运行循环。但我确实知道这个大小的最大值,所以如果需要的话,我可以最大化它而不是动态调整大小。

这是我的代码,我知道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;删除现在将数组清零,有没有比这些更快的方法?

请帮助我!

4 个答案:

答案 0 :(得分:3)

基本上你要比较苹果和橘子。

memset并且for循环显式地将内存内容设置为特定值(示例中的 0 )。同时,new仅分配足够的内存(至少按要求),而delete仅标记内存可供重用。该内存的内容没有变化。因此newdelete不会初始化/取消初始化实际内存内容 从技术上讲,该内存中的内容具有 Indeterminate值 。从字面上看,价值观可能是任何东西,你不能依赖它们来做任何具体的事情。它们可能是0,但它们并不能保证。实际上,使用这些值会导致程序出现 未定义行为

对课程进行new调用会做两件事:

  • 分配请求的内存&amp;
  • 调用类的构造函数来初始化对象。

但请注意,在您的情况下,类型为int,并且int没有默认初始化。

答案 1 :(得分:2)

new仅分配一个内存块,它不会初始化已分配的内存。 要初始化数组,您可以使用memset()或手动执行此操作。

答案 2 :(得分:0)

好的编译器会将所有4种方法优化为memset的1次调用。另外,3 rd 和4 th 方法之间有什么区别?

您也可以

int  array[TEST_SIZE] = {};

获得可读性并保存1行代码。

答案 3 :(得分:0)

在这种情况下,我会诉诸memsetfill是通用的,但该平台可以在memset的实现中为您提供一些非常好的技巧。这是可能的,因为这个功能在它的功能和哑巴中是毫不含糊的:

  • 它可以使用(S)DMA进行实际的内存修改,它可以更快地与内存接口。此外,在运行任务时,CPU可以执行其他操作
  • 当它知道必须按顺序写入连续的内存区域时,它可以做一些预防缓存失效的事情。
  • 基于ARM的嵌入式系统的实现可以从burst mode中受益;它是用特殊的汇编指令(STMFD,STMFA等)实现的,在这种模式下3次写入等于两次正常写入时间