按值返回与按引用返回时有哪些注意事项 - 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
更大,或大小相等
在查看 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