亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 為什么 沒調用 拷貝構造函數(shù) [打印本頁]

作者: homerzhou    時間: 2014-01-11 16:10
標題: 為什么 沒調用 拷貝構造函數(shù)
  1. class Person
  2. {
  3. public:
  4.     Person(){cout << "construct"<< endl;}
  5.     Person(const Person& p1) { cout << "copy" << endl; }
  6. };
  7. Person fun()
  8. {
  9.     Person p1;
  10.     return p1;
  11. }
  12. int main()
  13. {
  14.     fun();
  15.     return 0;
  16. }
復制代碼
為啥 不調用 拷貝構造函數(shù),很奇怪

可是如果 fun 函數(shù) 寫成這樣
  1. Person fun()
  2. {
  3.     Person *p1 = new Person;
  4.     return *p1;
  5. }
復制代碼
就調用了,這尼瑪 奇怪的
作者: Fomalhaut2    時間: 2014-01-11 16:22
上面那個可能是被編譯器優(yōu)化掉了。
作者: homerzhou    時間: 2014-01-11 16:34
對的,剛 知道  答案, 被編譯器 優(yōu)化掉的,這 叫 RVO的名字回復 2# Fomalhaut2


   
作者: math_cai    時間: 2014-01-11 17:09
GNU/Linux GCC(包括C++擴展) 默認使用cdecl調用約定,參數(shù)通過棧來傳遞,返回值放在EAX寄存器中。
如果返回數(shù)據(jù)長度大于EAX的長度,且返回的數(shù)據(jù)是棧上的變量,GCC會做特殊處理來避免一次內存拷貝:
返回值的內存由調用者分配,將該內存地址放到EAX中返回。(相當于將返回值的內存當作一個隱含的參數(shù)通過棧來傳遞給調用者)
作者: 注冊個ID太難    時間: 2014-01-11 21:41
回復 4# math_cai



   
作者: md5_crc4    時間: 2014-01-17 14:55
是優(yōu)化的吧。
比如
int main()
{
int a; //這樣的也不生成代碼,如果弄成 volatile int a; 它可能就ok了。
}


我是一只小小小小鳥。 。。感謝您的分享。。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2