从函数返回结构的更好方法是什么?
which is better way to returning structure from function?
有多种方法可以从函数 return 结构,例如 return 整个结构或 return 仅指针。
returning 指针有助于避免堆栈开销,因为我们不需要 return 整个结构。在另一边
小结构最好与 returning 整个结构一起使用。
在我的例子中,我有以下场景从另一个文件中获取结构并考虑使用各种方法,但由于我是 C 的新手,所以我仍然需要一些专家建议,比如
哪种方法更好?有什么问题吗?或者对新方法有什么建议吗?
return将大型结构作为一个整体会导致堆栈问题吗?
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;
}
file2.c
void myFunction()
{
struct_type mylocalStruct1 = getStructDataMethod1();
struct_type mylocalStruct2;
struct_type mylocalStruct3;
getStructDataMethod2(&mylocalStruct2);
getStructDataMethod3(&mylocalStruct3);
}
经验法则是始终通过指针而不是通过值将结构传递给函数,原因您自己也提到过。你应该只在结构非常小的情况下对这条规则进行特殊情况例外。
因此,方法 2 或 3 都是正确的方法。除了 NULL 指针检查之外,它们是等价的。
与您的问题无关的小问题:永远不要在 C 中将函数写成 void myFunction()
,这是过时的风格。请改用 void myFunction(void)
。
有多种方法可以从函数 return 结构,例如 return 整个结构或 return 仅指针。 returning 指针有助于避免堆栈开销,因为我们不需要 return 整个结构。在另一边 小结构最好与 returning 整个结构一起使用。
在我的例子中,我有以下场景从另一个文件中获取结构并考虑使用各种方法,但由于我是 C 的新手,所以我仍然需要一些专家建议,比如
哪种方法更好?有什么问题吗?或者对新方法有什么建议吗?
return将大型结构作为一个整体会导致堆栈问题吗?
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;
}
file2.c
void myFunction()
{
struct_type mylocalStruct1 = getStructDataMethod1();
struct_type mylocalStruct2;
struct_type mylocalStruct3;
getStructDataMethod2(&mylocalStruct2);
getStructDataMethod3(&mylocalStruct3);
}
经验法则是始终通过指针而不是通过值将结构传递给函数,原因您自己也提到过。你应该只在结构非常小的情况下对这条规则进行特殊情况例外。
因此,方法 2 或 3 都是正确的方法。除了 NULL 指针检查之外,它们是等价的。
与您的问题无关的小问题:永远不要在 C 中将函数写成 void myFunction()
,这是过时的风格。请改用 void myFunction(void)
。