c++函数中动态分配大结构时的返回值选择
The return value choose when dynamically allocate a big structure in a function in C++
输入function:
vector<MyClass>* My_func(int a)
{
vector<MyClass>* ptr = new vector<MyClass>;
//...... Add a lot of elements to this vector, and let's say MyClass is also relatively big structure.
return ptr;
}
这个方法留给用户释放指针的责任。
我能想到的另一种方法是在函数中创建局部变量并返回值:vector<MyClass> My_func(int a)
{
vector<MyClass> vec;
//...... Add a lot of elements to this vector, and let's say MyClass is also relatively big structure.
return vec;
}
这种方法避免了用户的责任,但在返回和复制值时可能会占用大量空间。
也许智能指针在c++是一个更好的选择,但我不确定。我以前没有用过智能指针。人们遇到这种情况会怎么做?他们会选择什么样的返回类型?
谢谢你的提示:-)
在这种构造的大多数情况下,编译器将执行"返回值优化",这意味着它实际上并没有复制返回的数据结构,而是直接写入将返回到的位置的数据结构。
因此,您可以安全地这样做,而不必担心它被复制。
然而,另一种方法是不首先返回一个向量,而是请求调用代码传递一个:
比如:
void My_func(int a, vector<MyClass>& vec)
{
...
}
保证避免复制。
在许多情况下,返回值优化可以很容易地处理不必要的复制。问题是:你打算如何在函数外使用这个向量?如果你有这样的内容:
vector<MyClass> ret = My_func(a);
然后优化可以处理这个问题。
另一方面,如果你想重用一个现有的vector
,你可以传递一个非const引用给一个现有的vector
,但在很多情况下,这是不需要或有用的。
vector<MyClass> ret;
// do something with ret ...
My_func(a, ret);
另外,这也改变了你的函数的语义(例如,你可能需要clear()
向量)。
下面是vector
的内部结构template <typename T>
class vector {
private:
size_t m_size;
size_t m_cap;
T * m_data;
public:
//methods push pop etc.
};
正如你所见,vector的大小(带有两个额外的size_t数据成员)并不比指针的大小大多少。传递向量而不是指针的性能优势可以忽略不计,事实上,使用指针访问向量会变慢,因为每次都必须解引用指针。一般不创建指向vector的指针。
同样,永远不要返回指向局部变量的指针。一旦返回值&本地变量的内存将被清除。超出方法的作用域。理想情况下,在调用方法My_func时,应该在调用函数中创建一个vector,并传递对vector的引用。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 如何确定函数的返回值在编译时选择可能的选项
- c++函数中动态分配大结构时的返回值选择