在科学模拟中适当的类成员访问

时间:2015-01-02 16:25:05

标签: c++ performance for-loop

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

  • 输入数据
    • Sample
    • Parameter(抽象基类,声明虚函数)
      • ParModel1
      • ParModel2
      • ...
  • 物理模型
    • Model(抽象基类,声明虚函数)
      • Model1
      • Model2
      • ...
  • 模拟
    • Simulation

Model子类(例如ModelX)定义virtual Calculation(int x)函数中的某些算法,代表要描述的物理模型X.此计算中使用的参数将由Sample对象和相应的ParModelX对象提供。 Simulation类知道如何处理Model一般情况,并最终执行给定x的计算(通过调用公共Calculation(int x) }} function ...在biiig for - 循环中。

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

由于Simulation类仅触发Model提供的公共计算功能,因此只有SampleParameter都必须与Model进行通信。

我应该......

  1. 让成员宣布private并提供get - 函数? (我读到对getter / setter的严重依赖可能是设计有缺陷的标志。在一个充足的for循环中,太多的函数调用是一个问题,还是分别是“坏样式”?)
  2. 让成员宣布'公开',但const(他们不需要改变!),以便'Model'可以在没有函数调用的情况下访问它们? (对我来说看起来不是很好的风格......)
  3. Model构造函数从给定的SampleParameter对象中提取参数,并将它们存储在自己的成员中以便快速访问(这会使Parameter类冗余!)
  4. friend SampleParameter(等)与Model s
  5. 相符
  6. 其他选择......?
  7. 我很关心速度(即使它在我的特定计算中可能不重要,我想知道什么是好的编程风格!)和我的程序的结构。例如,我不希望模型与模拟/计算过程混合在一起。输入数据和模型的分离对我来说似乎很好,因为有可能为一个模型设置许多参数集......

1 个答案:

答案 0 :(得分:2)

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

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

在考虑场景中的性能瓶颈时,我的直觉告诉我要注意通过价值和不必要的重新计算而不是重复使用中间结果来传递大数据结构。如果您真的对性能洞察感兴趣,请停止猜测,抓住其中一个profiling tools并开始测量!