按值返回结构体vs按引用返回结构体

Returning a struct by value vs by reference

本文关键字:结构体 返回 引用 vs      更新时间:2023-10-16

我想在c++中返回多个值,我有这段代码:

struct returns
{  
   int row_locs, col_locs;  
   int row_descriptors, col_descriptors;  
   double **locs;  
   double **descriptors;  
};

void returns (int &row_locs, int &col_locs, int &row_descriptors, int &col_descriptors, double **locs, double **descriptors)
{  
   //make some changes in variables 
}  

问题是"哪个消耗更多的时间:struct还是引用调用?"

在这两种情况下,差异可以忽略不计。你不应该担心这些问题,直到你发现它们是真正的问题。简短的回答:按你喜欢的方式做,考虑不同的方面,比如以后如何使用返回值。

如果你通过引用传递参数,那么它们已经在堆栈上或动态分配,并且它们的指向值由函数填充。时间花在将所有指针复制到堆栈中,并将它们的地址存储在被调用函数中。

在第二种情况下,整个结构体在堆栈上分配并填充(可能由结构体中缺少的单个构造函数填充)。将时间用于在堆栈上构造对象并填充其值。

当函数返回大于long(在x86和其他32位处理器上)或long long(在x86_64和其他64位架构上)的值时,它返回指向分配的内存的指针,然后数据被复制到本地结构

struct example
{
     long long a,b,c;
};
example create_new_struct(void)
{
     example tmp;           //new object is created
     tmp.a = 3;
     tmp.b = 4;
     bmp.c = 5;
     return example;       //in low-level pointer is returned and all data copied
}
void modify_existing_structure(example & tmp)
{
     tmp.a = 3;           //setting data directly
     tmp.b = 4;
     tmp.c = 5;
     return;
}
int main(void)
{
    example a = create_new_struct(), b;  //varaibles are being copied
    modify_existing_structure(b);        //variables are being set directly
    return 0;
}

所以你一定要使用引用。但是(正如我注意到的)你的代码毫无意义。您不应该使用匿名结构,并解析分隔的所有变量。在代码中,您为每个函数调用创建了六个指针,而不是一个。

同时,我认为你应该多学习一些面向对象的程序设计。