Return 按值安全的结构向量?
Return vector of structs by value safe?
我读到 return 从函数中按值构造结构是完全安全的。
Is it safe to return a struct in C or C++?
如果你 return 多个结构作为一个向量是否仍然安全?
例如
std::vector<mystruct> func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
std::vector<mystruct> structList;
structList.push_back(retval);
// create more structs and add them to list
..
return structList;
}
为什么?它只对原语安全吗? numbers 因为不需要分配内存?
只要正确编写 mystruct
class 就是安全的,这意味着它支持复制构造和赋值 and/or 移动,以及适当的销毁,具有隐含的值语义。
换句话说:"returning a vector" 事情不是这里的难点,它是确保你是否有一个 T t1;
处于任何有效状态,然后你可以说 T t2(t1);
and/or T t3; t3 = t1;
and/or 让任何 T
超出范围/成为 delete
d 并且不会发生任何不好或意外的事情。如果您的 T
适用于这些场景,那么在 vector<T>
中使用它都很好,即使是从函数按值返回也是如此。
但是哪些结构是安全的? mystruct
可以 copy/move construct/assign 并销毁如果小心只使非 static
数据成员成为以下类型之一,以及任何基础 classes做类似的事情:
简单数据类型,如int
、double
、bool
等
具有值语义的自我管理类型,无论是您自己编写的还是由标准库或其他库提供的 - 例如std::string
、std::map
、std::vector
、std::list
等这些懂得copy/move自己的正确
这种类型的数组
std::shared_ptr
到您确实想要共享所有权的数据,或 std::unique_ptr<>
到可以移动但不能复制的数据
引用,如果对象的副本引用同一个地方是有意义的
other struct
s and/or class
其成员和基础classes满足上述条件
但是不是原始指针(除非某些故意共享的数据的生命周期大于对象,例如static const
变量或字符串文字):对于 new
/new[]
-ed 数据对象意味着管理生命周期,你需要编写自己的复制构造函数 and/or 移动构造函数,复制赋值 and/or 移动赋值运算符和析构函数。使用 std::shared_ptr<>
或 std::unique_ptr<>
通常更容易和更好。
我读到 return 从函数中按值构造结构是完全安全的。
Is it safe to return a struct in C or C++?
如果你 return 多个结构作为一个向量是否仍然安全?
例如
std::vector<mystruct> func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
std::vector<mystruct> structList;
structList.push_back(retval);
// create more structs and add them to list
..
return structList;
}
为什么?它只对原语安全吗? numbers 因为不需要分配内存?
只要正确编写 mystruct
class 就是安全的,这意味着它支持复制构造和赋值 and/or 移动,以及适当的销毁,具有隐含的值语义。
换句话说:"returning a vector" 事情不是这里的难点,它是确保你是否有一个 T t1;
处于任何有效状态,然后你可以说 T t2(t1);
and/or T t3; t3 = t1;
and/or 让任何 T
超出范围/成为 delete
d 并且不会发生任何不好或意外的事情。如果您的 T
适用于这些场景,那么在 vector<T>
中使用它都很好,即使是从函数按值返回也是如此。
但是哪些结构是安全的? mystruct
可以 copy/move construct/assign 并销毁如果小心只使非 static
数据成员成为以下类型之一,以及任何基础 classes做类似的事情:
简单数据类型,如
int
、double
、bool
等具有值语义的自我管理类型,无论是您自己编写的还是由标准库或其他库提供的 - 例如
std::string
、std::map
、std::vector
、std::list
等这些懂得copy/move自己的正确这种类型的数组
std::shared_ptr
到您确实想要共享所有权的数据,或std::unique_ptr<>
到可以移动但不能复制的数据引用,如果对象的副本引用同一个地方是有意义的
other
struct
s and/orclass
其成员和基础classes满足上述条件
但是不是原始指针(除非某些故意共享的数据的生命周期大于对象,例如static const
变量或字符串文字):对于 new
/new[]
-ed 数据对象意味着管理生命周期,你需要编写自己的复制构造函数 and/or 移动构造函数,复制赋值 and/or 移动赋值运算符和析构函数。使用 std::shared_ptr<>
或 std::unique_ptr<>
通常更容易和更好。