c++ - 复制具有巨大数组成员的类时是否使用指针?

标签 c++ arrays pointers memory return

我有一个类存储一个多维数组作为成员。

struct Structure
{
    Structure()
    {
        memset(Data, 0, sizeof Data);
    }

    int Number;
    int Data[32][32][32];
}

当我编写返回此 Structure 对象的函数时,如果 Data 成员是复制的所有字节还是只是传递的引用?

Structure Create(int Parameter)
{
    Structure structure;

    // modify structure based on parameter
    // ...

    return structure;
}

如果这导致复制整个数据 block ,我怎样才能做得更好?像 Structure *structure = new Structure(); 这样在堆上分配对象并返回该指针会发生什么变化?

最佳答案

当您按值返回对象时,将复制实际数据(323 int)。编译器可能会优化掉拷贝(所谓的“复制省略”),但这永远无法保证。

如果你动态分配对象并返回指向它的指针,当然不会有复制。如果您可以访问 C++11,请考虑返回一个 std::unique_ptr,这样所有权就清楚了,并且没有内存泄漏的可能性。

在 C++11 中,您还可以“做得更好”,方法是将成员 Data 转换为一个容器(例如 std::vector),它在内部存储它的堆上的数据并具有移动语义。这意味着当从函数返回时,容器将被移动而不是被复制,并且数据不会被复制。

关于c++ - 复制具有巨大数组成员的类时是否使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612778/

相关文章:

javascript - 添加空格以填充数组长度

c - 将 char 指针数组传递给 C 中的函数?

c - 如何根据大小取消引用?

c++ - 隐式类实例化翻译单元 : multiple definition when linking

c++ - cin.get();当我把它放在 if 语句中时不起作用

c++ - 从 C++ 中的函数返回数组

C指针转换

C 函数指针类型兼容性

c++ - Linked List C++ Class 这两个添加节点实现有什么区别?

c++ - 简洁地重写一组参数数量可变的函数