возвращая объект (или структуру) в c ++ - PullRequest
1 голос
/ 30 сентября 2010

эй, у меня есть вопрос о том, что происходит в следующем коде:

 typedef struct {
      double re,im;
 } Complex;

 Complex ComplexCreate(double r=0.,doublei=0.)
 {
      Complex c;
      c.re=r;
      c.im=i;
      return c; // problem with this line 
      // my question is : is c getting duplicated and returning or does it return nothing
      // when i we go back to the main
 }

и я знаю, что в c ++ я могу и должен использовать классы, это просто то, что я хочу понятьтест.заранее спасибо за помощь

Ответы [ 5 ]

5 голосов
/ 30 сентября 2010

Если оптимизация не включена, будет создана и возвращена копия c. Если доступна оптимизация именованных возвращаемых значений (NRVO), компилятор может исключить копию.

Кроме того, почему не сложен класс с конструктором:

class Complex
{
public: 
    Complex( double r = 0.0, double i = 0.0 ) 
       : re( r ) 
       , im( i )
    {}

    double re;
    double im; 
};

Тогда, если вам все еще нужна функция типа Complex ComplexCreate (double r = 0., doublei = 0.), Она будет выглядеть так:

Complex ComplexCreate( double r= 0.0, double i = 0.0 )
{
    return Complex( r, i );
}

Возвращение здесь безымянной временной переменной означает, что компиляторы без оптимизации именованного возвращаемого значения (NRVO) будут иметь больше шансов удалить копию локального объекта - вместо этого, работая напрямую со стеком вызывающих.

4 голосов
/ 30 сентября 2010

Будет возвращен объект Complex, но он также не сможет сделать копию из-за NRVO .

3 голосов
/ 30 сентября 2010

C будет продублирован, и вы получите его.Вы можете проверить это самостоятельно:

#include <iostream>


typedef struct T {
double a;
int b;
} T;


T f() {
    T newT = {10.0,5};
    std::cout << "Temporary address : " << &newT << std::endl;
    return newT;
}

int main(int argc,char* argv[]) {
    T retT = f();
    std::cout << "Final address : " << &retT << std::endl;
}

обычно выдает разные адреса, такие как:

Temporary address : 0x7fff97d92660
Final address : 0x7fff97d926c0
2 голосов
/ 30 сентября 2010

Это может помочь вам понять механизм: http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/

0 голосов
/ 30 сентября 2010

Также

Стивен С. Дьюхерст "C ++ Gotchas. Как избежать проблем в кодировании и дизайне"

Gotcha 58.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...