构造和传递结构的结构作为函数参数的有效方法

efficient way to construct and pass structure of structure as a function parameter

本文关键字:结构 函数 参数 有效 方法      更新时间:2023-10-16
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;
};
基本上,我需要将包含其他结构的结构作为函数参数传递给类的构造函数。在这种情况下,最好的设计实践是什么?

注:如果我的理解不正确,请纠正。

方法1的理解>有一种最简单的方法来处理数据,我们不需要显式地分配资源和释放资源。唯一的担心是它可能涉及不必要的拷贝。然而,如果我总是使用引用传递,这应该不是问题。

我对方法2的理解>这种方法在FMOD库(http://www.fmod.org/)中被广泛使用,所以它一定有它的优势。但是我们必须手动分配和释放资源。

我对方法3的理解>它消除了手动释放已分配资源的需求,但与方法2相比,它涉及开销。

那么我应该在实践中使用哪种方法,什么时候使用?

为什么不直接将结构体作为构造函数的参数呢?

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";
    }
};

考虑将const引用传递给构造函数(假设它在构造过程中没有修改原始结构)。

StructB::StructB(const StructA &myobject)
{
     sa = myobject;
}

这将只涉及一次复制操作,这是在赋值期间(从而避免在参数传递期间复制)

如果你想完全避免复制,那么指针就是你的答案。简单地传递指针作为参数(StructA *结构)-但是你有一个管理分配的堆内存的问题(必须调用新的StructA和删除)。要么使用智能指针来解决这个问题,要么手动管理内存——有太多方法可以做到:)

如果你有问题请告诉我!

如果这只是一个引用,那么你可以使用引用成员并在actor中实例化它。

StructB{
StructB(const StructA & myobj) : sa( &myobj ){}
StructA &sa;
};

我相信当StructB超出作用域时,sharedptr将尝试销毁对象,因此如果您计划在该对象超出作用域后使用原始实例,这可能是一个坏主意。这应该抛出一个异常,特别是如果你在堆栈上而不是堆上声明了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 ){};
};