gpt4 book ai didi

c++ - 如何减少C++中的拷贝

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:51 27 4
gpt4 key购买 nike

我正在写一个 Bytearray 类,想实现一个成员函数 copy(int start, int end) 可以复制一段数据并返回一个新的字节数组 对象。我的实现是

Bytearray Bytearray::copy(int start, int end){
Bytearray b(end - start);
for(int i = start; i < end; i++){
b._data[i-start] = _data[i];
}
return b;
}

但是,据我所知,如果我调用 Bytearray aa = bb.copy(1, 5);,它需要复制数据 3 次。一种是将数据从 this 复制到临时对象 b 。然后它调用复制构造函数和 operator = 。如何减少文案,提高效率。

最佳答案

您的函数根本不调用 Bytearray::operator=()。调用者可能在表达式 x = a.copy(start, end) 中。

在实践中,大多数现代编译器都会省略临时变量,尽管 - 严格来说 - 标准并不要求它们这样做。

在 C++11 中,您可以提供移动构造函数,这将更明确地鼓励编译器省略临时变量。如果没有它(例如,您没有在 C++11 中提供移动构造函数,或者您使用的是 C++11 之前的编译器),典型的方法是通过引用传递目标对象

void Bytearray::copy(int start, int end, Bytearray& b)
{
for(int i = start; i < end; i++){
b._data[i-start] = _data[i];
}

或指针

void Bytearray::copy(int start, int end, Bytearray* b)
{
// assume b is the address of a valid object
for(int i = start; i < end; i++){
b->_data[i-start] = _data[i];
}

关于c++ - 如何减少C++中的拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32152328/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com