【问题标题】:What are the considerations when returning by value vs by reference - Set ADT C按值返回与按引用返回时的注意事项 - Set ADT C
【发布时间】:2019-09-16 07:09:08
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 请显示Set的定义。
  • 这不是一个明智的 API,所以你质疑它是对的。在适当的 C 程序中,我们不会按值传递结构/ADT,也不会将指针隐藏在 typedef 后面。此 API 违反了这两条规则之一。此外,没有 const 正确性。有点代码味道。

标签: c set pass-by-reference adt pass-by-value


【解决方案1】:

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


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

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

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

setIntersectionInPlace(set1, set2);

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

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

这会使set1不必要的复制,它大于或等于result 的大小

【讨论】:

  • 使用不可变参数的正确方法是使用const-qualified 指针。如果 Set 是隐藏在 typedef 后面的指针,那么它不能是 const 限定的,或者返回的 Set 也是。最可能的解释是,编写 API 的人不知道自己在做什么。
  • @Lundin 很有可能!一般来说,指针类型定义是不受欢迎的,除非订阅 Microsoft Systems Hungarian 表示法和类型,如 LPCSETFARPTRCSTDIOAFXSTFU...
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 2018-12-15
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多