2016-04-22 40 views
-3

最小工作示例:陣列在這段代碼中複製了多少次?

#include <string.h> 

struct pair_t; 

class A { 
    public: 
     A(const char *s) { strcpy(buf, s); } 
     struct pair_t dup(); 
    private: 
     char buf[32]; 
}; 

struct pair_t { 
    A left; 
    A right; 
}; 

struct pair_t A::dup() { 
    return (struct pair_t){ A(buf), A(buf) }; 
} 

int main() { 
    A a1("alpha");  
    pair_t pair = a1.dup(); 
} 

在線路pair_t pair = a1.dup();以及的A::dup()呼叫內,有多少次是buf數組複製? 2? 4?更多?


顯然我的問題不像我想的那麼清楚。讓我詳細說明一下。我還在尋找更多的「標準說明它應該做什麼」而不是「我現在安裝的編譯器的特定版本做了什麼」,所以我寧願不根據調試語句來計數。

A::dup中,我創建了一個struct pair_t並用兩個對象填充它。我稱這兩個對象的構造函數。因此,這是2.

推測這個pair_t是本地函數,但它從外部返回此函數。這是否會創建pair_t的副本以返回到main函數?如果是這樣,它是否也複製leftright裏面?如果是這樣,它是通過構造函數進行復制還是進行某種幕後直接內存複製?這些加起來有多少?

+0

JFME,什麼是MWE? –

+3

嘗試向構造函數添加一些跟蹤,然後創建一個複製和移動構造函數,以便您可以跟蹤這些跟蹤,*和*複製和移動賦值運算符。那麼這是一個簡單的計數問題。 –

+0

@VadimKey MWE是最小工作示例。 Stack Overflow上通常使用的術語 – Ana

回答

1

你可以很容易測試:

#include <cstring> 
#include <iostream> 
#include <algorithm> 

struct pair_t; 

class A { 
public: 
    A(const char *s) { 
    std::cout << "ctor: " << s << std::endl; 
    strcpy(buf, s); 
    } 

    A(const A& a) { 
    std::cout << "copy ctor: " << a.buf << std::endl; 
    memcpy(buf, a.buf, sizeof(buf)); 
    } 

    A(A&& a) { 
    std::cout << "move ctor" << a.buf << std::endl; 
    std::swap(buf, a.buf); 
    } 

    pair_t dup(); 
private: 
    char buf[32]; 
}; 


struct pair_t { 
    A left; 
    A right; 
}; 


pair_t A::dup() { 
    return (struct pair_t){ A(buf), A(buf) }; 
} 

int main() { 
    A a1("alpha"); 
    std::cout << "call dup:" << std::endl; 
    pair_t pair = a1.dup(); 
    return 0; 
} 

輸出:

ctor: alpha 
call dup: 
ctor: alpha 
ctor: alpha