MST

星途 面试题库

面试题:C++中复杂对象场景下拷贝构造函数的调用优化

已知有一个包含动态数组成员的C++类 `BigObject`: ```cpp class BigObject { private: int* data; int size; public: BigObject(int s) : size(s) { data = new int[size]; for (int i = 0; i < size; ++i) { data[i] = i; } } BigObject(const BigObject& other) : size(other.size) { data = new int[size]; for (int i = 0; i < size; ++i) { data[i] = other.data[i]; } } ~BigObject() { delete[] data; } }; ``` 现在有一个函数 `process` 接收 `BigObject` 作为参数并返回一个 `BigObject`: ```cpp BigObject process(BigObject obj) { // 对obj进行一些操作 return obj; } ``` 在 `main` 函数中调用 `process`: ```cpp int main() { BigObject original(1000); BigObject result = process(original); return 0; } ``` 这里拷贝构造函数会被多次调用,如何优化以减少不必要的拷贝构造函数调用?请说明优化的原理和修改后的代码。
20.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 优化原理
    • 在C++中,现代编译器支持返回值优化(RVO)和命名返回值优化(NRVO)。但在当前代码中,process函数按值传递参数,会导致一次不必要的拷贝构造。可以通过将参数改为const BigObject&,这样传递的是对象的引用,不会产生额外的拷贝。同时,对于返回值,如果编译器支持RVO或NRVO,会直接在调用者的栈上构造返回对象,避免返回时的拷贝。
  2. 修改后的代码
class BigObject {
private:
    int* data;
    int size;
public:
    BigObject(int s) : size(s) {
        data = new int[size];
        for (int i = 0; i < size; ++i) {
            data[i] = i;
        }
    }
    BigObject(const BigObject& other) : size(other.size) {
        data = new int[size];
        for (int i = 0; i < size; ++i) {
            data[i] = other.data[i];
        }
    }
    ~BigObject() {
        delete[] data;
    }
};

BigObject process(const BigObject& obj) {
    // 对obj进行一些操作
    return obj;
}

int main() {
    BigObject original(1000);
    BigObject result = process(original);
    return 0;
}