我在作业中对这个问题有点卡: 用 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();
}
输出是:
Array on stack time is 1.9990000000
Array on heap time is 2.9980000000
Press any key to continue . . .
我的理解是堆栈是用于局部变量和参数的小得多的内存分配,而堆是动态分配的内存的大池。这是我的问题... 使用随机类会影响函数执行所需的时间吗?在堆栈上分配大型数组是否因为可用内存较少而变慢?
我不是要你做我的功课,但我只需要一点帮助来澄清概念......任何帮助将不胜感激......
最佳答案
首先,请允许我吐槽一下。
作业——大概是在 C++ 编程课上——是一个糟糕的作业。它会将您的注意力转移到动态分配与静态或自动分配的性能影响上,但这不是您应该选择一种分配形式而不是另一种分配形式的主要原因。相反,在决定如何分配内存块时,除了所有权语义之外,还应该在性能之前考虑生命周期和可见性要求。即使撇开这个论点,测试仍然无效,因为您运行代码的硬件、数组中各个元素的大小和数组本身、操作系统、内核在分配时如何阻塞以及编译器的优化允许使用的所有这些都会影响您编写的任何真实代码的执行速度。但是这个赋值似乎暗示你应该得出结论,“看到了吗?动态分配速度较慢。我们永远不应该使用它。”这种推理是不正确的,并且会教您采用过早的优化。
好了,废话到此结束
开始你的任务。您主要做错了两件事。
- 作业从不要求您填充数组。
- 作业要求您分配数组 10k 次,但您只分配了一次。
- (奖励!)赋值不会要求您释放动态分配的数组——但它应该。
关于c++ - 分配给堆与堆栈的执行时间有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7996085/