了解函数返回
Understanding a function return
我是一个新手程序员,只简要介绍了函数调用的剖析(设置堆栈等)。我可以用两种不同的方式编写一个函数,我想知道哪个(如果有的话)更有效。这是针对有限元程序的,因此可以调用此函数数千次。它使用线性代数库Aramdillo。
第一种方式:
void Q4::stiffness(mat &stiff)
{
stiff.zeros; // sets all elements of the matrix to zero
// a bunch of linear algebra calculations
// ...
stiff *= h;
}
int main()
{
mat elementStiffness(Q4__DOF, Q4__DOF);
mat globalStiffness(totalDOF, totalDOF);
for (int i = 0; i < reallyHugeNumber; i++)
{
elements[i].stiffness(&elementStiffness, PSTRESS);
assemble(&globalStiffness, &elementStiffness);
}
return 0;
}
第二种方式:
mat Q4::stiffness()
{
mat stiff(Q4__DOF, Q4__DOF); // initializes element stiffness matrix
// a bunch of linear algebra calculations
// ...
return stiff *= h;
}
int main()
{
mat elementStiffness(Q4__DOF, Q4__DOF);
mat globalStiffness(totalDOF, totalDOF);
for (int i = 0; i < reallyHugeNumber; i++)
{
elementStiffness = elements[i].stiffness(PSTRESS);
assemble(&globalStiffness, &elementStiffness);
}
return 0;
}
我想我要问的是:使用第二种方式mat stiff
推送到堆栈,然后复制到elementStiffness
?因为我想矩阵被推送到堆栈然后被复制比传递矩阵被引用并将其元素设置为零要昂贵得多。
通过引用传递变量并对该变量进行计算要便宜得多。当 c++ 返回一个变量时,它几乎会复制它两次。
首先在函数内部,然后调用复制构造函数或赋值运算符,具体取决于值是分配给新变量还是现有变量,以初始化变量。如果你有一个用户定义的变量,其中包含一长串内部状态变量,那么这个赋值操作将占用运算符处理时间的很大一部分。
编辑#1:我忘记了c ++ 11和std::move。许多编译器可以像这样优化函数,以便他们可以使用 std::move,而不是复制 lvaue,它可以复制一个只是内存位置的 rvalue。
从表面上看,我认为第二种方法会贵得多,因为它既构造一个新的垫子,又在每次调用时将其复制到堆栈中。当然,这有点取决于垫子结构以第一种方式进行的频率。
也就是说,我认为最好的办法是设置一个实验和测试以确保(同意研究的建议)。
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数