按值返回与按引用返回时有哪些注意事项 - Set ADT C

What are the considerations when returning by value vs by reference - Set ADT C

在查看 C 中 Set ADT 的头文件时,我试图理解为什么函数 setUnion 或 setIntersection 是这样声明的:

Set setUnion(Set set1, Set set2); 
Set setIntersection(Set set1, Set set2);

我找不到实现,但我假设在这些函数内部,我们分配更多 space 并创建新集,然后添加所有必要的元素。 我认为 set1 和 set2 是通过引用传递的,那么为什么不更新其中一个并保存内存分配,而只是 return 一些通知更新是否成功的枚举? (例如我们可以更新左边的参数)。

如果它们不是通过引用传递的,我该如何更改签名才能这样做?

谢谢!

Set 几乎可以肯定是一个隐藏在 typedef 后面的指针,因此内部 struct 的实际引用传递才是最重要的。


not 更经常需要计算两个集合的并集或交集 而不改变其中任何一个 。事实上很有可能

Set result = setIntersection(set1, set2);
freeSet(set1);
set1 = result;

不会比您提议的替代方案性能差

setIntersectionInPlace(set1, set2);

更常见的 使用 setIntersectionInplace 计算不可变集的交集的情况需要编写

Set result = setCopy(set1);
setIntersectionInplace(result, set2);

这会制作一个 不必要的副本 set1,它比 result

更大,或大小相等