-1

我一直在编写一个具有相当大结构的程序,它通过引用几个函数来传递。但是,还有一些其他功能需要访问大型结构中的小块信息。没有编辑,只是阅读。

我正在考虑创建第二个结构,它只复制所需的特定信息并通过引用传递,而不是通过引用传递整个结构。

我想知道的是两件事:

  1. 由于我通过引用传递大型结构,因此确实没有性能影响。正确的?
  2. 即使 1) 是正确的,传递不应编辑的结构是否是不好的做法(即使它不会被编辑,但我仍然在这里谈论原理)。

进一步来说:

我有一个配置结构,它通过调用函数并通过引用传递结构来设置程序配置。有一些信息(进程名称、命令行参数)我只想用于提供信息的目的。我在问传递一个不是为了我想要使用它的目的的结构是否是不好的做法。

4

5 回答 5

2
  1. 正确的。

  2. 通过const引用传递它;您将获得通过引用传递的性能收益,而无需进行编辑。

顺便说一句,如果该功能只需要一小部分“大结构”,则可能表明这些字段“自行”存储一些信息 - 即不需要解释“大结构”的其余部分他们正确。在这种情况下,您可以考虑将它们移动到一个单独的struct,它本身就是第一个“大结构”的成员。

于 2013-04-01T14:42:26.113 回答
2

1)由于我通过引用传递大型结构,因此确实没有性能影响。正确的?

正确的。

2)即使1)是正确的,传递一个不应该编辑的结构是不是不礼貌(即使它不会被编辑,但我仍然在这里谈论原则)。

您可以让您的函数接受对的引用,const以确保该函数不会改变相应参数的状态。

我在问传递一个不是为了我想要使用它的目的的结构是否是不好的做法。

我不确定你的意思。你写它的方式,这绝对是一个不好的做法:你不应该使用某些东西来做它不应该做的事情。这意味着扭曲对象的语义。但是,您的其余问题似乎并不意味着这一点。

相反,您似乎关心传递对函数的引用,因为这可能允许函数改变参数的状态;但是如果该函数引用了const,它将无法更改其参数的状态。在这种情况下,不,这不是一个坏习惯。

如果您指的是函数只需要与结构的某些数据成员或成员函数一起使用,那么这也不一定是一个糟糕的设计。要求每个函数访问数据结构的每个成员是愚蠢的。

当然,这是我在不了解函数语义和特定数据结构的任何具体内容的情况下能写出的最好的。

于 2013-04-01T14:42:39.410 回答
0

更进一步,您可以将此类配置对象保存在共享指针中并将其传递到您想要的任何地方,因此您不必担心结构的所有权。通过这种方式,您可以确保所有程序组件共享单个原始配置对象

于 2013-04-01T14:44:35.383 回答
0

就像其他人说的那样,使用 const。

如果您正在使用 C++,请使用访问器函数访问这些小信息。然后不需要更改结构状态的函数将不必触及任何成员字段,只有成员函数。

于 2013-04-01T14:53:32.290 回答
0

正如其他人所提到的,const&如果您不修改数据。

但是,您关于“我应该将数据复制到较小的数据”的观点struct大多被掩盖了。答案是“也许”。

不这样做的一个很好的理由是这是浪费时间——实际上,复制东西需要时间。

这样做的一个很好的理由是它会降低子过程的有效状态。不访问全局变量(因此也不访问全局状态)且未传递任何指针的子过程具有非常有限的状态。具有有限状态的过程更容易测试,通常更容易理解,并且通常更容易调试。

通常,您希望使用该函数解决问题所需的绝对最少数据量来调用每个函数。如果您避免将“指向所有内容的指针”(并且引用是指针)传递给每个函数,则可以维护此规则,并且通常可以使代码更易于维护。

另一方面,将数据从大的整体状态中剥离出来并进入小struct的本地状态可能包含错误和错误。

完全避免这个问题的一种方法是避免参数都混合在一起的大的单体状态对象,如果有一些参数捆绑在一起来回答一些问题,它们应该在自己的子struct中开始。现在调用子过程很容易——你传入struct已经绑定了参数的子程序。

于 2013-04-01T15:19:08.767 回答