在 C++ 中实现全局应用程序设置
Posted
技术标签:
【中文标题】在 C++ 中实现全局应用程序设置【英文标题】:Implement global application settings in C++ 【发布时间】:2013-03-14 13:20:38 【问题描述】:我有一个比较大的学术模拟软件(50个班)。用户选择一个包含 20 多个项目的配置文件。这些常量变量在整个仿真平台(几乎在每个类中)都使用。模拟每秒运行数十万个代理对象几次,因此性能很重要。
目前我使用单例设置类。我使用实例在程序启动时从文件中读取值到类中(我不想在每个其他类中添加对设置类的引用)。
1- 我最近运行了一个分析器,发现对 getInstance().getSomeSetting() 的过多调用影响了性能。
2- 每次我谈到单例使用时,都会受到很多谴责。
在这种情况下访问设置的最佳做法是什么?我应该为这 20 多个配置项使用全局变量吗?
【问题讨论】:
我不相信调用 gettter 会极大地降低性能(即使在调试模式下,但我敢肯定,你是在发布)。仅当您每次都在读取配置文件时(我认为您不是)。 “我应该为这 20 多个配置项使用全局变量吗?”。您的单音是一组全局变量。显示设置类的代码。 我知道单例被认为等于一个全局变量(但不完全是,因为我每次都调用两个函数)。单例类是一个标准类,我只读了一次文件。它不会极大地降低性能。它达到的性能超出了我的预期(比如 3-4% 左右)。 您多久致电一次getInstance().getSomeSetting()
?读取后是否将设置缓存在局部变量或类成员中?
如果getInstance
定义在header 中并且get-functions 非常简单并且你也可以在header 中定义它们,那么编译器应该优化直接访问Settings
类的适当成员的调用。或者,您可以通过使用 inline
指令标记 getter 来帮助编译器。只有当最少的代码(实际上是有用的计算)非常小时,我才能相信 3-4%
@TAS:这就是重点。每次运行我都会使用它多次,导致每秒几十万次。是的,我将设置读入类变量(然后可以通过 setter/getter 访问)
【参考方案1】:
您可以将配置对象保存在 shared_ptr 中并将其传递到您想要的任何地方,这样您将拥有一个单独的设置对象
【讨论】:
传递一个指向 50 多个类的指针(+可能的向前减速等)?以上是关于在 C++ 中实现全局应用程序设置的主要内容,如果未能解决你的问题,请参考以下文章