Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数返回结构的更好方法是什么?_C_Structure_Return Value - Fatal编程技术网

C 从函数返回结构的更好方法是什么?

C 从函数返回结构的更好方法是什么?,c,structure,return-value,C,Structure,Return Value,从函数返回结构有多种方法,如返回整个结构或仅返回指针。 返回指针有助于避免堆栈开销,因为我们不需要返回整个结构。在另一边 结构小,与整体结构配合良好 在我的例子中,我在下面的场景中从另一个文件中获取结构,并考虑了各种使用方法,但由于我是C语言新手,所以我仍然需要一些专家建议,如 哪种方法更好?有什么问题吗?或者对新方法有什么建议 整体返回大型结构会导致堆栈问题吗 file1.c static struct_type mysruct; //Note : here struct size is 25

从函数返回结构有多种方法,如返回整个结构或仅返回指针。 返回指针有助于避免堆栈开销,因为我们不需要返回整个结构。在另一边 结构小,与整体结构配合良好

在我的例子中,我在下面的场景中从另一个文件中获取结构,并考虑了各种使用方法,但由于我是C语言新手,所以我仍然需要一些专家建议,如

哪种方法更好?有什么问题吗?或者对新方法有什么建议

整体返回大型结构会导致堆栈问题吗

file1.c

static struct_type mysruct; //Note : here struct size is 250+ bytes

//Method 1
struct_type getStructDataMethod1()
{
    return mysruct;
}

//Method 2
void getStructDataMethod2(struct_type *structPtr)
{
    if(structPtr != NULL)
    {
        memcpy(structPtr, &mysruct, sizeof(struct_type));
    }
}
//Method 3
void getStructDataMethod3(struct_type *structPtr)
{
    *structPtr = mysruct;
}
void myFunction()
{
    struct_type mylocalStruct1 = getStructDataMethod1();
    struct_type mylocalStruct2;
    struct_type mylocalStruct3;

    getStructDataMethod2(&mylocalStruct2);
    getStructDataMethod3(&mylocalStruct3);

}
file2.c

static struct_type mysruct; //Note : here struct size is 250+ bytes

//Method 1
struct_type getStructDataMethod1()
{
    return mysruct;
}

//Method 2
void getStructDataMethod2(struct_type *structPtr)
{
    if(structPtr != NULL)
    {
        memcpy(structPtr, &mysruct, sizeof(struct_type));
    }
}
//Method 3
void getStructDataMethod3(struct_type *structPtr)
{
    *structPtr = mysruct;
}
void myFunction()
{
    struct_type mylocalStruct1 = getStructDataMethod1();
    struct_type mylocalStruct2;
    struct_type mylocalStruct3;

    getStructDataMethod2(&mylocalStruct2);
    getStructDataMethod3(&mylocalStruct3);

}

经验法则是总是通过指针传递结构到函数,而不是通过值传递,因为你提到了你自己。只有在结构非常小的情况下,才应该对此规则进行特殊情况例外

因此,方法2或3都是正确的方法。除了空指针检查之外,它们是等价的



与您的问题无关的小问题:永远不要用C语言编写函数作为
void myFunction()
,这是过时的样式。请改用
void myFunction(void)

经验法则是始终通过指针将结构传递给函数,而不是通过值,原因是您提到了自己。只有在结构非常小的情况下,才应该对此规则进行特殊情况例外

因此,方法2或3都是正确的方法。除了空指针检查之外,它们是等价的



与您的问题无关的小问题:永远不要用C语言编写函数作为
void myFunction()
,这是过时的样式。改为使用
void myFunction(void)

Method2/3为调用方提供了对结构生命周期的显式控制,而无需依赖其他地方的静态声明。否则,这基本上就是洗衣服。所有3种情况下都会发生复制。(要么这样做,要么隐式处理复制)
getStructDataMethod2()
getStructDataMethod3()
是等效的(减去
NULL
检查)。@pmg是的,但我认为第三种方法可以避免调用memcpy。另一种选择是使用全局变量(但尽量使用您介绍的选项之一:全局变量很容易成为管理上的难题)@pmg yes管理全局是困难的,这就是为什么我将mystruct的作用域限制在file1.c,并为它引入了get API。Method2/3让调用方显式地控制结构的生命周期,而不必依赖其他地方的静态声明。否则,这基本上是一个清洗。所有3种情况下都会发生复制。(要么这样做,要么隐式处理复制)
getStructDataMethod2()
getStructDataMethod3()
是等效的(减去
NULL
检查)。@pmg是的,但我认为第三种方法可以避免调用memcpy。另一种选择是使用全局变量(但请尽量使用您介绍的选项之一:全局变量很容易成为管理上的难题)。@pmg是的,管理全局是困难的,这就是为什么我将mystruct的范围限制在file1.c,并为此引入了get API。感谢您的回答,所以在method2中调用'memcpy'没有什么区别吗?比如性能方面“=”是更快还是“memcpy”?还是内部完成了相同的事情?@user2520119除非编译器被破坏,否则它应该为memcpy生成与结构赋值相同的机器代码。请自行查看:谢谢您的回答,所以在方法2中调用“memcpy”没有什么区别?比如性能方面的“=”更快还是“memcpy”?或者内部完成了相同的事情?@user2520119除非编译器被破坏,否则它应该为memcpy生成与结构赋值相同的机器代码。请参见: