介于 [固定数组] 和 [带内存分配的指针] 之间的性能
performance between [fixed array] and [pointer with memory allocation]
我正在制作可以计算很多次(10+小时(的科学代码,所以速度比任何其他事情都重要。
案例1
class foo{
public:
double arr[4] = {0};
...
foo& operator = (foo&& other){
std::memcpy(arr, other.arr, sizeof(arr));
}
...
}
案例2
class fee{
public:
double *arr = nullptr;
fee(){
arr = new double[4];
}
~fee(){
if(arr != nullptr)
free[] arr;
}
...
&fee operator = (fee&& other){
arr = other.arr;
other.arr = nullptr;
}
...
}
这些类用于向量(长度 4(和矩阵(大小 4x4(计算。
我听说编译器可以优化固定大小的数组。 但在这种情况下,无法优化 r 值计算(因为必须复制所有元素而不是指针切换(。
A = B*C + D;
所以我的问题是,内存分配和释放或复制亲密记忆哪个更昂贵?
或者也许还有另一种方法可以提高性能(例如创建表达式类(?
第一个性能并不是一个真正的语言问题(除了标准库中使用的算法(,而是一个实现问题。无论如何,大多数最常见的实现将程序堆栈用于自动变量,将系统堆用于动态变量(通过new
分配(。
在这种情况下,性能将取决于使用情况。堆管理是有代价的。因此,如果您经常分配和解除分配它们,堆栈管理应该是赢家。但另一方面,移动分配的数据只是指针交换的问题,当您可能需要为未分配的数据memcpy
时。
总内存也有很强的影响。堆内存仅受可用系统内存(运行时(的限制,而堆栈大小通常在构建时(链接阶段(定义,并在加载时静态分配。因此,如果总大小仅在运行时已知,请使用动态内存。
您在这里尝试进行低级优化。然后规则是进行分析。构建一个小程序,使这些结构达到预期用途,并在这两种实现中使用分析工具(*(。我会尝试使用具有良好内置优化的标准向量。
(*( 请注意,简单地测量一次运行的时间是不准确的,因为它取决于许多其他参数,例如其他程序(包括系统程序(引起的负载。
相关文章:
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 动态分配的数组和静态数组之间的区别
- make_pair和大括号 { } 之间的区别,用于在C++中分配一对?
- 如何在它们之间分配和使用 2 个不同类的函数指针?
- 按引用传递和动态内存分配之间的区别是什么
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 对这两个分配运营商之间的不同感到困惑
- 2 点分配之间的 C++ 距离
- 为什么分配的变量地址之间相差 16 个字节?
- 将工作与固定数量的螺纹之间的工作和pthread之间的分配
- 分配列表和初始化器列表之间 C++11 缩小的差异
- 为什么我会看到在堆和堆栈上分配的阵列之间的不同行为
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 分配指针的方法之间有什么区别?
- 在C++容器中,作为模板参数提供的分配器和作为构造函数参数提供的分配程序之间的区别
- C++均匀地分配单词之间的空格
- 将数组分配在固定数量的线程之间
- 理解C++中双指针和单指针内存分配之间的区别的问题