我有一个类存储一个多维数组作为成员。
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/