Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 科学仿真中正确的类成员访问_C++_Performance_For Loop - Fatal编程技术网

C++ 科学仿真中正确的类成员访问

C++ 科学仿真中正确的类成员访问,c++,performance,for-loop,C++,Performance,For Loop,我目前正在开发一个程序,一个科学模拟,具有以下结构(第一级-逻辑分组,第二级-实现类,第三级-实现子类): 输入数据 示例 参数(抽象基类,声明虚拟函数) ParModel1 ParModel2 物理模型 模型(抽象基类,声明虚拟函数) Model1 Model2 模拟 模拟 Model子类(例如ModelX)定义了虚拟计算(intx)函数中的某些算法,代表待描述的物理模型x。此计算中使用的参数将由示例对象和相应的ParModelX对象提供。 模拟类通常知道如何处理模

我目前正在开发一个程序,一个科学模拟,具有以下结构(第一级-逻辑分组,第二级-实现类,第三级-实现子类):

  • 输入数据
    • 示例
    • 参数
      (抽象基类,声明虚拟函数)
      • ParModel1
      • ParModel2
  • 物理模型
    • 模型
      (抽象基类,声明虚拟函数)
      • Model1
      • Model2
  • 模拟
    • 模拟
Model
子类(例如
ModelX
)定义了
虚拟计算(intx)
函数中的某些算法,代表待描述的物理模型x。此计算中使用的参数将由
示例
对象和相应的
ParModelX
对象提供。
模拟
类通常知道如何处理
模型
,并最终将对给定的
x
执行计算(通过调用公共
计算(int x)
函数)。。。在biiig
for
循环中

我们接近实际问题。。。在每次迭代期间,将执行由
ModelX
定义的计算,因此需要访问
Sample
ParModelX
对象的各种参数

由于
模拟
类仅触发提供的
模型
的公共计算功能,因此只有
样本
参数
必须与
模型
通信

我应该

  • 成员是否声明了
    private
    并提供了
    get
    -功能?(我读到严重依赖getter/setter可能是设计有缺陷的标志。太多的get函数调用可能是丰富的
    for
    循环中的一个问题,还是分别是“糟糕的风格”
  • 是否已将成员声明为“public”但
    const
    (它们不需要更改!),以便“Model”可以在不调用函数的情况下访问它们?(在我看来,这不是一种好的风格…)
  • 模型
    构造函数从给定的
    样本
    参数
    对象中提取参数,并将它们存储在自己的成员中,以便快速访问(这将使
    参数
    类冗余!)
  • friend
    样本
    参数
    (等)与相应的
    模型
    s
  • 其他选择

  • 我关心的是速度(即使它在我的特定计算中可能并不重要,我想知道什么是好的编程风格!)和我的程序结构。一、 例如,不希望模型与模拟/计算过程混合。输入数据和模型的分离对我来说似乎很好,因为一个模型可能有多个参数集…

    所有这些都取决于很多情况,因此请注意以下一般考虑事项

    只要你不知道你正面临性能问题,我肯定会支持结构良好的设计而不是性能优化。如果你需要回到这段代码,例如,如果你需要以某种方式扩展它,你会感谢你自己。将数据结构与操作它们的对象分离显然是一个很有价值的想法。引入常量值,希望获得更好的性能,同时牺牲在计算中使用不同值集的能力,听起来是个坏主意。就个人而言,我喜欢getter和setter,因为它们提供了访问数据的接口,同时抽象了数据在内部的表示方式。我不期望它们会对性能造成很大的影响,它们甚至可能被编译器使用“”。
    friend
    关键字是一个访问修饰符,并且(除了某些特定于编译器的黑魔法)可能不会对性能产生太大影响——我只在单元测试的上下文中使用过它


    在考虑您的场景中的性能瓶颈时,我的直觉告诉我,要注意像按值传递大数据结构和不必要的重新计算之类的事情,而不是重用中间结果。如果你真的对性能洞察感兴趣,停止猜测,抓住其中一个,开始测量

    “糟糕的设计,因为所有成员都需要getter?性能问题,因为在一次迭代中多次调用getter?”对不起,这是胡说八道。谁告诉你的?@πάνταῥεῖ 实际上我没有被告知,但在很多问题和链接的评论中,我读到基于get和set函数的使用的类设计在这一点上可能被认为是糟糕的(考虑到封装等)。到目前为止,我至少在一定程度上同意这一点。现在,如果GET/SET是必需的,那么它并没有错。我只是想知道(我的问题)它们是否在我的情况下,或者是否有更好的选择我还没有考虑。@πάνταῥεῖ 那么,您认为我应该为所有与模拟相关的成员(实际上都是成员)编写getter吗?如果你真的想一直使用纯的,你可以放弃getter/setter函数。尽管考虑一些类似生成的类,它们甚至有意识地拒绝显示为POD结构。这完全取决于在系统中传递参数数据的实际需求,以及构建块中的接口类型。(临屋区)