构造结构的结构并将其作为函数参数传递的有效方法
Posted
技术标签:
【中文标题】构造结构的结构并将其作为函数参数传递的有效方法【英文标题】:efficient way to construct and pass structure of structure as a function parameter 【发布时间】:2011-12-22 15:25:06 【问题描述】:struct StructA
int i;
int j;
;
// Method 1
struct StructBA
int k;
StructA sa;
// Method 2
struct StructCA
int m;
StructA *psa;
;
// Method 3
struct StructDA
int n;
boost::shared_ptr<StructA> psa;
;
基本上,我需要将包含其他结构的结构作为函数参数传递给类的构造函数。 在这种情况下,最佳设计实践是什么?
注意:如果理解不正确,请更正我的理解。
我对方法一的理解> 处理数据有最简单的方法,我们不需要显式分配资源和释放资源。 唯一担心的是它可能涉及不必要的副本。但是,如果我总是使用引用传递,这应该不是问题。
我对方法二的理解> 这种方法在 FMOD 库(http://www.fmod.org/)中已经被广泛使用,所以它一定有它的优势。但是我们必须手动分配和释放资源。
我对方法3的理解> 它消除了手动释放分配资源的要求,但与方法 2 相比,它涉及开销。
那么我应该在实践中使用哪种方法以及何时使用?
【问题讨论】:
c++: when to use pointers?的可能重复 我知道何时使用指针/引用的规则,但这是一个不同的问题。 【参考方案1】:为什么不让结构体作为构造函数的参数?
struct StructA //original struct
int i;
int j;
;
struct StructB
StructB(StructA& ref) //Just struct
std::cout<<"i: "<<ref.i<<", j:"<<ref.j<<"\n";
StructB(StructA& ref, int param) //Struct and parameter
std::cout<<"i: "<<ref.i<<", j: "<<ref.j<<", parameter: "<<param<<"\n";
;
【讨论】:
我喜欢 printf 的语法胜过 std::cout。【参考方案2】:考虑将 const 引用传递给构造函数(假设它在构造过程中不修改原始结构)。
StructB::StructB(const StructA &myobject)
sa = myobject;
这将只涉及一个复制操作,即在赋值期间(从而避免在参数传递期间复制)
如果您想完全避免复制,那么指针就是您的答案。只需将指针作为参数传递(StructA *结构) - 但是您会遇到管理分配的堆内存的问题(必须调用新的 StructA 并删除)。要么使用智能指针来解决这个问题,要么手动管理内存——方法太多了:)
如果您有任何问题,请告诉我!
【讨论】:
【参考方案3】:如果这只是一个引用,那么您可以使用引用成员并在 ctor 期间实例化它。
StructB
StructB(const StructA & myobj) : sa( &myobj )
StructA &sa;
;
我相信 sharedptr 会在 StructB 超出范围时尝试销毁该对象,因此如果您打算在该对象超出范围后使用原始实例,这可能是一个坏主意。这应该抛出一个异常,特别是如果您在堆栈而不是堆上声明了 StructA。您的另一个选择是使 StructA 成为可移动对象,然后通过分配获得所有权。
StructA
StructA( StructA && toMove ) *this = std::move( toMove ); ;
StructA & opertor=( StructA && toMove ) //swap this and toMove ;
;
StructB
StructB( StructA && toMove ) : sa( std::move( toMove );
;
【讨论】:
以上是关于构造结构的结构并将其作为函数参数传递的有效方法的主要内容,如果未能解决你的问题,请参考以下文章