为什么在堆上迭代大型数组比在堆栈上迭代相同大小的数组更快?

enk*_*nko 5 c++ visual-c++

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

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

此代码仅在vc ++中使用/ STACK:41943040链接器标记进行了测试.

#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);
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

    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
Run Code Online (Sandbox Code Playgroud)

为什么堆栈数组的迭代速度比堆上的相同?

编辑:nneonneo cought我的错误

现在输出完全相同:

    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
Run Code Online (Sandbox Code Playgroud)

根据Öö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
Run Code Online (Sandbox Code Playgroud)

nne*_*neo 9

你的阵列大小不一样; sizeof(char[23068672]) != sizeof(int[23068672]),元素属于不同类型.


Öö *_*iib 1

你的电脑出了问题,在我的旧 Pentium 4 上,分配这样的基于堆栈的字符数组需要 15 毫秒。您是否尝试过调试版本或其他版本?