gpt4 book ai didi

c++ - 科学模拟中适当的类(class)成员访问

转载 作者:行者123 更新时间:2023-11-28 02:35:12 26 4
gpt4 key购买 nike

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

  • 输入数据
    • 示例
    • 参数(抽象基类,声明虚函数)
      • ParModel1
      • ParModel2
      • ...
  • 物理模型
    • Model(抽象基类,声明虚函数)
      • 模型 1
      • 模型 2
      • ...
  • 模拟
    • 模拟

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

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

由于Simulation类只触发Model提供的一个公共(public)计算函数,所以只有SampleParameter它们都必须与 Model 通信。

我应该...

  1. 成员是否已声明private 并提供get 函数? (我读到对 getters/setters 的严重依赖可能是设计缺陷的标志。在充足的 for 循环中太多的 get 函数调用会不会是一个问题,或者它分别是“糟糕的风格”?)
  2. 是否已将成员声明为“public”但 const(它们不需要更改!)以便“Model”无需函数调用即可访问它们? (我觉得风格不太好……)
  3. Model 构造函数从给定的 SampleParameter 对象中提取参数,并将它们存储在自己的成员中以便快速访问(这将使 Parameter 类变得多余!)
  4. friend SampleParameter (等)与相应的 Model
  5. 其他选择...?

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

最佳答案

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

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

在考虑您的场景中的性能瓶颈时,我的直觉告诉我宁愿提防诸如按值传递大数据结构和不必要的重新计算之类的事情,而不是重用中间结果。如果您真的对性能洞察感兴趣,请停止猜测,捕获其中之一 profiling tools并开始测量!

关于c++ - 科学模拟中适当的类(class)成员访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27745203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com