一个最小的工作示例:
#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
中,我创建了一个结构pair_t
并用两个对象填充它。我调用这两个对象的构造函数。所以这是2。
据推测,此pair_t
是此函数的本地,但它在外部返回到此函数。这是否会创建要返回到main
函数中的pair_t
副本?如果是这样,它是否也会复制里面的left
和right
?如果是这样,它是通过构造函数复制还是执行某种幕后直接内存复制?这些加起来有多少?
您可以轻松测试它:
#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