数组在此代码中复制了多少次



一个最小的工作示例:

#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副本?如果是这样,它是否也会复制里面的leftright?如果是这样,它是通过构造函数复制还是执行某种幕后直接内存复制?这些加起来有多少?

您可以轻松测试它:

#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

最新更新