【问题标题】:How many times is the array copied in this piece of code?这段代码中数组复制了多少次?
【发布时间】: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 函数中?如果是这样,它是否也将leftright复制到里面?如果是这样,它是通过构造函数复制还是进行某种幕后直接内存复制?这些加起来是多少?

【问题讨论】:

  • JFME,什么是 MWE?
  • 尝试向构造函数添加一些跟踪,然后创建一个复制和移动构造函数,以便您也可以跟踪它们,一个复制和移动赋值运算符。然后就是一个简单的计数问题。
  • @VadimKey MWE 是最小工作示例。 Stack Overflow 上常用的一个术语
  • @JoachimPileborg 是否保证副本始终由构造函数完成?
  • @Ana,还有复制和移动构造函数以及返回值优化。顺便说一句,在提及类型时,您不需要在 C++ 中指定“struct”。

标签: c++ arrays copy


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2021-04-21
    • 2019-07-22
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多