栈内存储器返回一个对象后还调用它的析构函数吗
栈内存返回一个对象后还调用它的析构函数吗?
MyString类是含有一个char *m_data成员的类
这是析构函数
这是其中一个函数,其中声明了一个MyString类型的对象,其m_data为NULL
1.tempStr内存什么时候释放?是在这个函数执行完以后释放,还是在程序最后释放?
2.如果是栈内存里的对象,在跳出函数释放对象内存后,对象还会不会调用析构函数?
3.返回tempStr是值传递,返回需要先将它拷贝,如果我没有写MyString::MyString(const MyString & str);构造函数的话,会不会出错误?会出现什么错误?
------解决方案--------------------
不进行返回值优化,
会函数调用前,会创建,返回值临时变量 假设名称为 result
return tempStr
会拷贝 tempStr 到 result ;result =tempStr
返回 result
的指针到 寄存器中(Windows Xp等 32位系统是 eax寄存器)
// pop ebp
// lea eax,result
假设有调用 x= operator+(s1,s2)
那么 结果就是 x= *eax = result;
如果优化 所有对 tempStr的操作,结果会变成对result的操作,result =tempStr
的代码就不会出现, eax 依然是 result的地址,
最后如果result 被优化掉,那么对tempStr
的操作会转移到 x上来.
这就是返回结构类型或者类类型的通常的方式
float,double 通常放在浮点寄存器堆栈中(ST)
char,short,int,long 等整型以及指针通常直接放在寄存器(eax)中返回
long long 可能会放在 (edx:eax 两个寄存器中)返回
每个硬件平台都不同,同样不同编译器,也不一定相同
不过,如果能够调用相同的API, 那么Api 那种调用约定的函数,返回值的返回方式,一定是相同的.
不论何种编程语言.
MyString类是含有一个char *m_data成员的类
这是析构函数
MyString::~MyString()
{
delete [] m_data;
}
这是其中一个函数,其中声明了一个MyString类型的对象,其m_data为NULL
MyString operator+(const MyString& str1,const MyString& str2)
{
MyString tempStr;
****......
return tempStr;
}
1.tempStr内存什么时候释放?是在这个函数执行完以后释放,还是在程序最后释放?
2.如果是栈内存里的对象,在跳出函数释放对象内存后,对象还会不会调用析构函数?
3.返回tempStr是值传递,返回需要先将它拷贝,如果我没有写MyString::MyString(const MyString & str);构造函数的话,会不会出错误?会出现什么错误?
栈
内存
------解决方案--------------------
不进行返回值优化,
会函数调用前,会创建,返回值临时变量 假设名称为 result
return tempStr
会拷贝 tempStr 到 result ;result =tempStr
返回 result
的指针到 寄存器中(Windows Xp等 32位系统是 eax寄存器)
// pop ebp
// lea eax,result
假设有调用 x= operator+(s1,s2)
那么 结果就是 x= *eax = result;
如果优化 所有对 tempStr的操作,结果会变成对result的操作,result =tempStr
的代码就不会出现, eax 依然是 result的地址,
最后如果result 被优化掉,那么对tempStr
的操作会转移到 x上来.
这就是返回结构类型或者类类型的通常的方式
float,double 通常放在浮点寄存器堆栈中(ST)
char,short,int,long 等整型以及指针通常直接放在寄存器(eax)中返回
long long 可能会放在 (edx:eax 两个寄存器中)返回
每个硬件平台都不同,同样不同编译器,也不一定相同
不过,如果能够调用相同的API, 那么Api 那种调用约定的函数,返回值的返回方式,一定是相同的.
不论何种编程语言.