gpt4 book ai didi

c++ - 了解函数返回

转载 作者:太空狗 更新时间:2023-10-29 21:22:16 25 4
gpt4 key购买 nike

我是一名新手程序员,只简要介绍了函数调用的结构(设置堆栈等)。我可以用两种不同的方式编写一个函数,我想知道哪种方式(如果有的话)效率更高。这是一个有限元程序,所以这个函数可以被调用数千次。它使用线性代数库 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,它可以复制一个右值,它只是内存位置。

关于c++ - 了解函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20916387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com