【发布时间】:2016-04-22 05:36:03
【问题描述】:
一个最小的工作示例:
#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 是这个函数的本地的,但是它是在这个函数的外部返回的。这是否会创建 pair_t 的副本以返回到 main 函数中?如果是这样,它是否也将left和right复制到里面?如果是这样,它是通过构造函数复制还是进行某种幕后直接内存复制?这些加起来是多少?
【问题讨论】:
-
JFME,什么是 MWE?
-
尝试向构造函数添加一些跟踪,然后创建一个复制和移动构造函数,以便您也可以跟踪它们,和一个复制和移动赋值运算符。然后就是一个简单的计数问题。
-
@VadimKey MWE 是最小工作示例。 Stack Overflow 上常用的一个术语
-
@JoachimPileborg 是否保证副本始终由构造函数完成?
-
@Ana,还有复制和移动构造函数以及返回值优化。顺便说一句,在提及类型时,您不需要在 C++ 中指定“struct”。