2016-04-22 38 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