分配给堆与堆栈的执行时间有什么不同?

Som*_*ive 3 c++ performance

在我的作业中我对这个问题有点困惑: 用C或C++编写三个函数:一个静态地声明一个大数组,一个在堆栈上声明相同的大数组,一个从堆中创建相同的大数组.每次调用每个子程序{至少100,000次}并输出每个子程序所需的时间.解释结果.

    int main(void)  
{
    int staticIntArray[ARRAY_SIZE];//array on the stack
    int *ptrArray = new int[ARRAY_SIZE]; // pointer on the stack but array on the heap.
    double timeItTakes;
    clock_t tStart = clock();
    fillWithRandomNumbers(staticIntArray, ARRAY_SIZE);
    double time = static_cast<double>(clock() - static_cast<double>(tStart)/static_cast<double>(CLOCKS_PER_SEC));
    printf ("Array on stack time is %.10f\n", time);
    clock_t tStart2 = clock();
    fillWithRandomNumbers(ptrArray, ARRAY_SIZE);
    double time2 = static_cast<double>(clock() - static_cast<double>(tStart2)/static_cast<double>(CLOCKS_PER_SEC));
    printf ("Array on heap time is %.10f\n", time2);
    //cout << "Array on the heap time is " << (timeIntStack - time(NULL));
}
void fillWithRandomNumbers(int intArray[], int size)
{
    for(int i = 0; i<size; i++)
        intArray[i] = rand();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Array on stack time is 1.9990000000
Array on heap time is 2.9980000000
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

我所理解的是,堆栈是用于局部变量和参数的小得多的内存分配,而堆是动态分配的内存的大型池.以下是我的问题...使用随机类会影响函数执行所需的时间吗?是否在堆栈上分配大型数组的速度较慢,因为可用内存较少?

我不是要求你做我的作业,但我只是需要一些帮助来澄清这些概念......任何帮助都会非常感激......

Joh*_*ing 6

首先,请允许我轻微咆哮.

赋值 - 可能是在C++编程类中 - 是一个糟糕的.这是您转移焦点的动态分配与静态或自动分配的性能影响,但不是主要的,你应该选择配置的一种形式了另一个原因.相反,在决定如何分配一块内存时,应该在性能之前考虑除了所有权语义之外的生命周期和可见性要求.即使抛开这个论点,测试仍然无效,因为你运行代码的硬件,数组中各个元素的大小和数组本身,操作系统,内核在分配时如何阻塞以及编译器的优化是允许使用都会影响您编写的任何实际代码的执行速度.但是这个任务似乎暗示你应该总结,"看?动态分配是慢的.我们永远不应该使用它." 这种推理是不正确的,并教你采用过早优化.

好的,我的咆哮结束了.

关于你的任务.你做了两件大事错了.

  1. 赋值永远不会要求您填充数组.
  2. 赋值要求您分配10k次数组,但是您只执行一次.
  3. (Bonus!)赋值不要求你释放动态分配的数组 - 但它应该.

  • 让我想知道谁在大学教C++.那些无法将其视为真正的程序员的人? (2认同)