gpt4 book ai didi

c++ - 为什么在堆上迭代一个大数组比在堆栈上迭代相同大小的数组更快?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:07 25 4
gpt4 key购买 nike

我正在分配 2 个相同大小的数组,一个在堆栈上,一个在堆上,然后用简单的赋值遍历它们。

可执行文件被编译为主线程堆栈分配 40mb。

此代码仅经过测试可在带有/STACK:41943040 链接器标记的 vc++ 中编译。

#include "stdafx.h"
#include <string>
#include <iostream>
#include <malloc.h>
#include <windows.h>
#include <ctime>

using namespace std;

size_t stackavail()
{
static unsigned StackPtr; // top of stack ptr
__asm mov [StackPtr],esp // mov pointer to top of stack
static MEMORY_BASIC_INFORMATION mbi; // page range
VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi)); // get range
return StackPtr-(unsigned)mbi.AllocationBase; // subtract from top (stack grows downward on win)
}

int _tmain(int argc, _TCHAR* argv[])
{
string input;

cout << "Allocating 22mb on stack." << endl;
unsigned int start = clock();
char eathalfastack[23068672]; // approx 22mb
auto length = sizeof(eathalfastack)/sizeof(char);
cout << "Time taken in ms: " << clock()-start << endl;

cout << "Setting through array." << endl;
start = clock();
for( int i = 0; i < length; i++ ){
eathalfastack[i] = i;
}
cout << "Time taken in ms: " << clock()-start << endl;
cout << "Free stack space: " << stackavail() << endl;


cout << "Allocating 22mb on heap." << endl;
start = clock();
// auto* heaparr = new int[23068672]; // corrected
auto* heaparr = new byte[23068672];
cout << "Time taken in ms: " << clock()-start << endl;

start = clock();
cout << "Setting through array." << endl;
for( int i = 0; i < length; i++ ){
heaparr[i] = i;
}
cout << "Time taken in ms: " << clock()-start << endl;

delete[] heaparr;
getline(cin, input);
}

输出是这样的:

    Allocating 22mb on stack.
Time taken in ms: 0
Setting through array.
Time taken in ms: 45
Free stack space: 18872076
Allocating 22mb on heap.
Time taken in ms: 20
Setting through array.
Time taken in ms: 35

为什么堆栈数组的迭代比堆上的相同事物慢?

编辑:nneonneo 纠正我的错误

现在输出是相同的:

    Allocating 22mb on stack.
Time taken in ms: 0
Setting through array.
Time taken in ms: 42
Free stack space: 18871952
Allocating 22mb on heap.
Time taken in ms: 4
Setting through array.
Time taken in ms: 41

根据以下 Öö Tiib 的回答发布构建:

    Allocating 22mb on stack.
Time taken in ms: 0
Setting through array.
Time taken in ms: 5
Free stack space: 18873508
Allocating 22mb on heap.
Time taken in ms: 0
Setting through array.
Time taken in ms: 10

最佳答案

你们的数组大小不一样; sizeof(char[23068672]) != sizeof(int[23068672]),元素类型不同。

关于c++ - 为什么在堆上迭代一个大数组比在堆栈上迭代相同大小的数组更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12907399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com