了解函数返回

Understanding a function return

本文关键字:返回 函数 了解      更新时间:2023-10-16

我是一个新手程序员,只简要介绍了函数调用的剖析(设置堆栈等)。我可以用两种不同的方式编写一个函数,我想知道哪个(如果有的话)更有效。这是针对有限元程序的,因此可以调用此函数数千次。它使用线性代数库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。

从表面上看,我认为第二种方法会贵得多,因为它既构造一个新的垫子,又在每次调用时将其复制到堆栈中。当然,这有点取决于垫子结构以第一种方式进行的频率。

也就是说,我认为最好的办法是设置一个实验和测试以确保(同意研究的建议)。