通过引用传递结构的C++编程实践
C++/C Programming practice on passing structures by reference
我一直在写一个程序,它有一个相当大的结构,通过引用传递给一些函数。然而,还有一些其他功能需要访问大型结构中的小块信息。它没有被编辑,只是阅读。
我想创建一个第二个结构,只复制所需的特定信息片段,并通过引用传递,而不是通过引用传递整个结构。
我想知道的是两件事:
- 由于我是通过引用的方式传递大型结构,因此对性能确实没有影响。正确吗
- 即使1(是正确的,传递一个不应该编辑的结构(即使它不会被编辑,但我仍然在这里谈论原理(是不是一种糟糕的做法
更具体地说:
我有一个配置结构,它通过调用函数并通过引用传递结构来设置程序配置。有些信息(进程名称、命令行参数(我只想用于提供信息的目的。我在问,绕过一个不适合我使用的结构是否是一种糟糕的做法。
1( 由于我是通过引用的方式传递大型结构,因此对性能确实没有影响。对的
正确。
2( 即使1(是正确的,传递一个不应该编辑的结构(即使它不会被编辑,但我仍然在这里谈论原则(是不是不礼貌。
您可以让您的函数接受对const
的引用,以确保该函数不会更改相应参数的状态。
我在问,绕过一个不适合我使用的结构是否是一种糟糕的做法。
我不知道你说的是什么意思。从你写的方式来看,这似乎是一种糟糕的做法:你不应该用一些东西来做它不该做的事情。这意味着扭曲对象的语义。然而,你问题的其余部分似乎并不意味着这一点。
相反,您似乎关心传递对函数的引用,因为这可能会允许函数更改参数的状态;但如果函数引用const
,它将无法更改其参数的状态。在这种情况下,不,这不是一个坏的做法。
如果你指的是函数只需要与结构的一些数据成员或成员函数一起工作,那么这不一定是一个糟糕的设计。要求每个函数访问数据结构的每个成员是愚蠢的。
当然,这是我在不了解函数语义和特定数据结构的情况下所能写的最好的一篇文章。
-
正确。
-
通过
const
引用传递;在不允许编辑的情况下,您将通过引用获得pass的性能增益。
顺便说一句,如果该函数只需要"大结构"的一小部分,那么这可能表明这些字段"自己"存储了一些信息,即不需要"大构造"的其余部分来正确解释它们。在这种情况下,您可以考虑将它们移动到一个单独的struct
,它本身就是第一个"大结构"的成员。
更进一步,您可以将这些配置对象保存在共享指针中,并将其传递到您想要的任何位置,因此您不必担心结构的所有权。通过这种方式,您可以确保所有程序组件共享单个原始配置对象
就像其他人所说的那样,使用const。
如果使用C++,请使用访问器函数访问这些小信息。然后,不需要更改结构状态的函数将不必接触任何成员字段,只需接触成员函数。
正如其他人所提到的,如果不修改数据,则为const&
。
然而,您关于"我是否应该将数据复制到较小的struct
"的观点大多被掩盖了。答案是"也许"。
不这样做的一个很好的理由是这是浪费时间——从字面上讲,复制东西需要时间。
这样做的一个很好的理由是它会降低子流程的有效状态。一个子过程不访问全局变量(因此也不访问全局状态(,也不传递任何指针,其状态非常有限。状态有限的过程更容易测试,通常更容易理解,并且通常更容易调试。
通常,您希望用该函数解决问题所需的绝对最少的数据量来调用每个函数。如果您避免向每个函数传递"指向一切的指针"(引用就是指针(,则可以维护此规则,而且它通常会导致代码更易于维护。
另一方面,将数据从大的单片状态剥离到小的局部struct
s中可能会包含错误和错误。
完全避免这个问题的一种方法是避免参数混合在一起的大型整体状态对象,如果有一些参数捆绑在一起回答一些问题,那么它们应该在自己的子struct
中开始。现在调用子过程很容易——您可以传入已经绑定了参数的子struct
。
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- C++编程从外部文本文件定义数组大小
- 了解算法的性能差异(如果以不同的编程语言实现)
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 使用命名空间正确编程
- C++编程:运算符重载中的引用如何工作?
- Arduino 模块化编程与全局和设置
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 试图修复一个错误,该错误不会让我开始编程其余部分
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 如何使用可变参数模板类使用模板元编程获得最大值