VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 845|回复: 5

堆/堆栈/程序数据区变量的访问速度?

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-5 13:00:01 | 显示全部楼层 |阅读模式
在dos时代,程序中有near指针和far指针,near指针只需要寻址偏移地址,速度较快,far指针访问内存时还需要配合段寄存器,访问速度较慢。
但现在对于win32的32位扁平模式的程序设计,内存访问已经不需要段寄存器的配合了或者说段寄存器已经改变了用途,那么对于堆栈、堆以及位于数据区的全局变量的内存访问,纯粹的访问速度上还有差别吗?大家有做过这方面的实验吗?
回复

使用道具 举报

1

主题

15

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-1-5 15:30:01 | 显示全部楼层
学习。。。看楼下高手意见
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-5 15:33:01 | 显示全部楼层
关注
回复

使用道具 举报

0

主题

30

帖子

22.00

积分

新手上路

Rank: 1

积分
22.00
发表于 2020-1-5 19:03:01 | 显示全部楼层
基本上没有差别...

// DumpStack.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>

#define MAX_NUMBER_OF_DATA 1000

int g_dataArray[MAX_NUMBER_OF_DATA];

void global()
{
        // Testing...
        LARGE_INTEGER c1, c2;
        ::QueryPerformanceCounter(&c1);
        for (int i = 0; i < MAX_NUMBER_OF_DATA; ++i)
        {
                g_dataArray[i] = i;
        }
        ::QueryPerformanceCounter(&c2);
        printf("### Global performance count: %I64u\n", c2.QuadPart - c1.QuadPart);
}

void stack()
{
        int dataArray[MAX_NUMBER_OF_DATA];
        // Testing...
        LARGE_INTEGER c1, c2;
        ::QueryPerformanceCounter(&c1);
        for (int i = 0; i < MAX_NUMBER_OF_DATA; ++i)
        {
                dataArray[i] = i;
        }
        ::QueryPerformanceCounter(&c2);
        printf("### Stacking performance count: %I64u\n", c2.QuadPart - c1.QuadPart);
}

void dump()
{
        int* pDataArray = new int[MAX_NUMBER_OF_DATA];
        // Testing...
        LARGE_INTEGER c1, c2;
        ::QueryPerformanceCounter(&c1);
        for (int i = 0; i < MAX_NUMBER_OF_DATA; ++i)
        {
                pDataArray[i] = i;
        }
        ::QueryPerformanceCounter(&c2);
        printf("### Dumping performance count: %I64u\n", c2.QuadPart - c1.QuadPart);
        delete [] pDataArray;
        pDataArray = NULL;
}

int main(int argc, char* argv[])
{
        for (int i = 0; i < 100; ++i)
        {
                printf("====== No.%d ======\n", i);
                global();
                dump();
                stack();
        }

        return 0;
}

回复

使用道具 举报

0

主题

1

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-1-6 09:18:10 | 显示全部楼层
关注并学习。
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-4-20 22:00:01 | 显示全部楼层
其实,如果数据量再放大1000倍,还是有一定差距的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表