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
!]您描述了分配和释放过程,但这个问题是关于访问已分配的内存。您描述了分配和释放过程,但这个问题是关于对已分配内存的访问。