在C函数中返回一个结构体是可以的,还是返回一个指向用malloc()[closed]创建的结构体的指针更好?

toe95027  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(75)

已关闭,此问题为opinion-based。它目前不接受回答。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

上个月关门了。
Improve this question
这两种选择都是法律的,但哪一种更好或更“干净”:
假设我们有这样的结构:

typedef struct MyStruct {
int val;
} MyStruct;

第一个选项;直接返回一个结构体:

MyStruct Create()
{
MyStruct a;
a.val = 0;
return a;
}

第二个选项:在堆上创建结构体并返回一个指针:

MyStruct* CreatePtr()
{
MyStruct *a = (MyStruct*)malloc(sizeof(MyStruct));
a->val = 0;
return a;
}

我认为最好的选择取决于结构体的大小,但也许它们需要考虑更多的因素?

zbwhf8kr

zbwhf8kr1#

根据经验,除非有充分的理由将结构放在堆上,否则应使用堆栈。一般来说,总是尽可能直接地向编译器描述你的意图,这样它就可以做得最好-检查返回值优化,如果你只是传递堆栈,可能会发生什么;结果结构很可能直接构建在调用者的存储中,完全避免了调用堆栈(需要注意)。
我们离为了好的编译而避免直接措辞的时代还有很长的路要走。
如果你有一个具体的原因,这是一个问题,从那里分析和优化。

zlwx9yxi

zlwx9yxi2#

这取决于程序设计。一般来说,返回(和传递)整个结构的代价更高,并且它会消耗自动存储持续时间空间,这在大多数实现中是有限的。
这个问题没有答案,这取决于你的需求。

sy5wg1nm

sy5wg1nm3#

struct很小并用于表示数字的特定情况下,如以下示例.

typedef struct {
  int numerator;
  int denominator;
} fraction.

.我发现返回一个struct(如fraction foo(fraction a, fraction b))比指针更有用。该形式模仿math.h库,并允许:

fraction e = fraction_add(fraction_mul(a, b), fraction_mul(c, d));

对其他案件不予置评。

相关问题