Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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++_C_Memory_Memory Management_Resources - Fatal编程技术网

C++ 堆上的分配是否会影响访问性能?

C++ 堆上的分配是否会影响访问性能?,c++,c,memory,memory-management,resources,C++,C,Memory,Memory Management,Resources,众所周知: ptr = malloc(size); 或者用C++ ptr = new Klass(); 将在堆上分配大小字节。它的效率低于堆栈上的效率 但在分配之后,当我们访问它时: foo(*ptr); 或 它的性能是否与堆栈上的数据相同,或者更慢?这取决于您正在比较什么以及如何比较 如果你的意思是 ptr = malloc(10 * sizeof(int)); 慢于: int arr[10] ptr = arr; 然后使用ptr访问它所指向的整数 那就不行了 如果在第二种情况下

众所周知:

ptr = malloc(size);
或者用C++

ptr = new Klass();
将在堆上分配大小字节。它的效率低于堆栈上的效率

但在分配之后,当我们访问它时:

foo(*ptr);


它的性能是否与堆栈上的数据相同,或者更慢?

这取决于您正在比较什么以及如何比较

如果你的意思是

ptr = malloc(10 * sizeof(int)); 
慢于:

int arr[10]
ptr = arr; 
然后使用
ptr
访问它所指向的整数

那就不行了

如果在第二种情况下使用
arr[0]
而不是
*ptr
,可能是因为编译器必须读取
ptr
中的值才能找到实际变量的地址。但是,在许多情况下,它将“知道”ptr中的值,因此不需要读取指针本身

如果我们将
foo(ptr)
foo(arr)
进行比较,这根本不会有任何区别


[实际在堆上分配内存可能会有一些损失,因为在第一次使用时必须“提交”内存。但是,每4KB最多只能提交一次,在大多数情况下,我们可能会忽略这一点]。

这实际上取决于您比较的内容和方式

如果你的意思是

ptr = malloc(10 * sizeof(int)); 
慢于:

int arr[10]
ptr = arr; 
然后使用
ptr
访问它所指向的整数

那就不行了

如果在第二种情况下使用
arr[0]
而不是
*ptr
,可能是因为编译器必须读取
ptr
中的值才能找到实际变量的地址。但是,在许多情况下,它将“知道”ptr中的值,因此不需要读取指针本身

如果我们将
foo(ptr)
foo(arr)
进行比较,这根本不会有任何区别


[实际在堆上分配内存可能会有一些损失,因为在第一次使用时必须“提交”内存。但每4KB最多只能提交一次,在大多数情况下,我们可能会忽略这一点].

明确回答此问题的唯一方法是对两个版本进行编码,并在多个场景(不同的分配大小、不同的优化设置等)下衡量它们的性能。这类事情在很大程度上取决于许多不同的因素,例如优化设置、操作系统如何管理内存、分配的块大小、访问的位置等。决不要盲目地假设一种方法在所有情况下都比另一种方法更“有效”


即使这样,结果也只适用于您的特定系统

明确回答这个问题的唯一方法是对两个版本进行编码,并在多个场景(不同的分配大小、不同的优化设置等)下衡量它们的性能。这类事情在很大程度上取决于许多不同的因素,例如优化设置、操作系统如何管理内存、分配的块大小、访问的位置等。决不要盲目地假设一种方法在所有情况下都比另一种方法更“有效”


即使这样,结果也只适用于您的特定系统

堆栈比Heap快得多,因为它只涉及移动堆栈指针。堆栈的大小是固定的。与堆不同,用户需要手动分配和取消分配内存。

堆栈比堆快得多,因为它只需要移动堆栈指针。堆栈的大小是固定的。与堆不同,用户需要手动分配和取消分配内存。

在比较在O(n^2)时间内运行的算法与O(nlogn)时间内运行的算法时,效率考虑非常重要

比较内存访问,这两种算法都是O(n)或O(k),并且通常是无法测量任何差异

然而,如果您正在为频繁调用的内核编写一些代码,那么一个微小的差异可能是可以测量的


在这个问题的上下文中,真正的答案是它真的不重要,使用任何使您的程序易于阅读和维护的存储。因为,从长远来看,花钱让人阅读代码的成本要高于运行cpu以获取更多或更少指令的成本。

在比较以O(n^2)时间运行的算法与以O(nlogn)时间运行的算法时,效率方面的考虑非常重要

比较内存访问,这两种算法都是O(n)或O(k),并且通常是无法测量任何差异

然而,如果您正在为频繁调用的内核编写一些代码,那么一个微小的差异可能是可以测量的


在这个问题的上下文中,真正的答案是它真的不重要,使用任何使您的程序易于阅读和维护的存储。因为,从长远来看,花钱让人们阅读你的代码的成本要比运行一个cpu来获取更多或更少的指令的成本要高。

我不认为这在实践中有很大的不同。我不认为这在实践中有很大的不同。我的意思是,例如:
struct Bar
和使用
foo(Bar)
,和
struct Bar*Bar=malloc(sizeof(struct Bar))
和使用
foo(*Bar)
访问,超出调用
malloc
,否。[当然还有随后调用
free
!]我的意思是,例如:
struct Bar
和使用
foo(Bar)
,以及
struct Bar*Bar=malloc(sizeof(struct Bar))
和使用
foo(*bar)
访问,除了调用
malloc
,否。[当然还有随后调用
free
!]您描述了分配和释放过程,但这个问题是关于访问已分配的内存。您描述了分配和释放过程,但这个问题是关于对已分配内存的访问。