繁体   English   中英

当返回类型是一个类时,指向返回值的指针的名称是什么?

[英]When the return type is a class, what's the name of the pointer to the return value?

一个例子:


class A  
{  
    ....  
    A func();  
};  

A A::func()  
{  
...  
return something;  
}  

在汇编级别,编译时,函数A::func实际上将具有两个参数:第一个是this指针,第二个是由调用方创建的用于存储返回值的temp A对象的地址。

例如,如果我们编写a.func() ,程序将在堆栈中创建一个temp A对象(我们将其称为t ),并将a的地址作为第一个参数传递, t的地址作为第二个参数传递,最后调用函数func

这里是我的问题:在实现A::func ,我们可以得到的地址a -它的指针this ; 但是我们有办法得到t的地址吗? 它叫什么名字?

例如,如果我想在返回结果之前进行一些内存分配/释放操作,则拥有它会很有用。

这是我想做的一个例子:

class A
{
    int * data;
    A func();
};

A A::func()
{
    // here "ret_p" is the pointer to the return value (let's pretend that it exists)  
    ret_p->data = new int[some length];  
    ...  
    return * ret_p;  
}

当然,我可以在A::func创建一个本地对象,然后将其返回。 但是程序会在我的本地对象和调用者创建的临时对象之间进行复制。 由于调用者已经创建了一个临时对象,所以我希望直接使用它可以节省时间和空间。 那可能吗?

好吧,这可能不是c ++,但我仍然希望...

堆栈中没有这样的temp A对象参数( t )。

如果调用A a1 = a.func(); return something; 在内部,将调用copy constructor ,等效于此A a1(something); a1something是不同的实例。

如果您A a1; a1 = a.func(); A a1; a1 = a.func(); return something; 在里面, a1 = something; // (operator =) a1 = something; // (operator =)将被调用。 a1something是不同的实例。

如果调用A a1 = a.func(); return A(p1); 在内部,这等效于A a1(p1); ,有一个实例a1

如果调用a.func(); 直接分配给var而不return something; 在内部,返回时什么也没有发生。

如果调用a.func(); 直接而不分配给var并return A(p1); 在内部,将构造一个临时对象,然后立即销毁它。

如果您A a1; a1 = a.func(); A a1; a1 = a.func(); return A(p1); 在内部,将构造一个临时对象,然后将operator =称为a1 = temp object; 然后临时对象将被销毁。

供你参考。

毕竟, A a1 = a.func()A a1; a1 = a.func() A a1; a1 = a.func()return something; // a var return something; // a varreturn A(p1); // call constructor return A(p1); // call constructor会导致不同的行为,我认为您可以正确控制内存。

func提供&a复制省略的一种形式。

根本无法保证会发生这种情况,也没有C ++级别的实现访问。

当您说“我想在返回结果之前先分配一些内存/释放内存”时,我认为您不清楚自己的想法,您能举一个具体的例子吗? 复制省略,移动运算符和RAII可能使您所需的一切成为可能。


响应您的示例,这是您应该如何做的。

class A
{
    std :: vector <int> data;
    A func();
};

A A::func()
{
    A ret;
    ret .data .assign (some_length, 123); // or whatever;
    return ret;
}

由于复制省略,这可能会优化您想要的自动方式。 如果您认为编译器不会删除副本,请添加move构造函数。

A :: A (A && old)
: data (std :: move (old .data))
{
}

std::vector的move构造函数将只复制指针。 如果你想知道如何工作 ,以及这里的本土的同等学历。

class A
{
    int * data;

    // Allocate
    A (size_t size) : data (new int [size]) {}

    // Free, only if we haven't moved.
    ~ A () {if (data) delete [] data;}

    // Move
    A (A && old) : data (old .data) {old .data = nullptr;}

    A (const A &) = delete; // or implement with a new allocation.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM