Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪个访问堆栈或堆更快?_C++_Performance_Stack - Fatal编程技术网

C++ 哪个访问堆栈或堆更快?

C++ 哪个访问堆栈或堆更快?,c++,performance,stack,C++,Performance,Stack,我知道从堆栈分配内存更快,但是当访问一个变量时速度更快 例如: void fn1() { int *p=new int[50]; for(int i=0;i<50;i++) p+i=i*i; } void fn2() { int p[50]; for(int i=0;i<50;i++) p[i]=i*i; } void fn1() { int*p=新的int[50]; 对于(int i=0;i),您将通过调用新< /

我知道从堆栈分配内存更快,但是当访问一个变量时速度更快 例如:

void fn1()
{
    int *p=new int[50];
    for(int i=0;i<50;i++)
        p+i=i*i;
}

void fn2()
{
    int p[50];
    for(int i=0;i<50;i++)
        p[i]=i*i;
}
void fn1()
{
int*p=新的int[50];

对于(int i=0;i),您将通过调用<代码>新< /代码>来分配数组命中,但之后它们将具有相同的性能特性。

如果考虑分配,

void fn1()
{
    int *p=new int[50];
    for(int i=0;i<50;i++)
        p+i=i*i;
}

void fn2()
{
    int p[50];
    for(int i=0;i<50;i++)
        p[i]=i*i;
}

第二个函数的执行速度比第一个快。当您在堆栈上分配内存时,指令被嵌入,这样它将移动堆栈指针,并且在大多数体系结构上几乎都是一条指令。

我已经有一段时间没有深入研究过C了。对数组进行索引应该是一个快速的操作。我想在第一个函数中,你增加指针……在第二个函数中,你将索引到数组中,这与增加指针以到达相应数组元素的内存位置几乎相同。

尽管标准没有对此做任何说明,但在使用统一内存结构应该没有差异。由于CPU中缓存的影响,您可能会看到访问时间上的一些差异,因为堆栈中分配的数组
p
中的数据(在地址方面)将更接近函数的其他局部变量的数据(除非优化器选择将这些局部变量放入寄存器中),但总体访问时间应该相同

void fn1()
{
    int *p=new int[50];
    for(int i=0;i<50;i++)
        p+i=i*i;
}

void fn2()
{
    int p[50];
    for(int i=0;i<50;i++)
        p[i]=i*i;
}

动态分配内存的最大影响是调用
malloc
free

你指的是堆栈还是堆?为什么不测试它?我对这两种方法都没有把握,特别是在机器上,但通常
new
比只保留spac要慢得多问题是,在用数据填充内存后,您将使用内存做什么?如果要返回数据,堆分配的数据将不需要复制,而堆栈数据将需要复制。可能会重复测量时间;)?
void fn1()
{
    int *p=new int[50];
    for(int i=0;i<50;i++)
        p+i=i*i;
}

void fn2()
{
    int p[50];
    for(int i=0;i<50;i++)
        p[i]=i*i;
}