配置文件的实现
Implementation of config file
我正在用C++制作一个应用程序,它需要一个在启动时读取和解释的配置文件。它将包含以下内容:
Module1=true
现在,我最初的计划是将其全部存储在变量中,并简单地使用
If(module1) {
DO_STUFF();
}
然而,这似乎是浪费,因为它会不断地检查一个永远不会改变的值。有什么想法吗?
只有在使用探查器发现瓶颈时才优化代码分支预测应该在这里做它的事情,module1
永远不会改变,所以如果你在循环中调用它,即使也不应该有明显的性能损失。
如果你想进行实验,你可以进行一次分支,并使指针指向正确的函数:
using func_ptr = void (*)();
func_ptr p = [](){};
if(module1)
p = DO_STUFF;
while(...)
p();
但这只是一个侧面,看看组装。。。
还有一些较慢但舒适的方法可以存储配置,例如,在具有枚举索引的数组或映射中。如果我想在循环中获得一些值,我会这样做:
auto module1 = modules[MODULE1]; // array and enumeration
//auto module1 = modules.at("module1"); // map and string
while(...)
{
if(module1)
DO_STUFF;
...
}
所以我最终会得到你已经拥有的。
性能方面,布尔检查没有问题,除非您开始执行数百万或数十亿次。也许你可以开始合并属于module1的代码,但除此之外,你必须像现在做一样检查它
这真的不是问题。如果你的程序要求Module1
应该为true,那么让它检查值并继续。除非检查太多次,否则它不会影响你的性能。
您可以做的一件事是,如果检查了太多次,就生成一个内联函数。然而,您必须确保函数不应该太大,否则它将是一个更大的瓶颈
对不起,伙计们,我查找时没有发现这个:MDSN所以我在启动时检查了一次布尔值,然后我就不需要再检查了,因为只有正确的函数才会启动。
根据程序的设置方式以及变量如何改变代码的行为,您可以使用函数指针:
if(Module1 == true)
{
std::function<void(int)> DoStuff = Module1Stuff;
}
然后:
while(true)
{
DoStuff(ImportantVariable);
}
请参阅http://en.cppreference.com/w/cpp/utility/functional/function以供进一步参考。
我并不认为这会有多大帮助,但至少这是一种尝试的选择。
如果您知道所检查值的所有用例,就可以解决这个问题。例如,如果您已经读取了配置文件,并且module1
是true
,那么您可以做一件事,如果是false
,则可以做另一件事。让我们从示例开始:
class ConfigFileWorker {
public:
virtual void run() = 0;
};
class WithModule1Worker {
public:
void run() final override {
// do stuff as if your `Module1` is true
}
};
class WithoutModule1Worker {
public:
void run() final override {
// do stuff as if your `Module1` is false
}
};
int main() {
std::unique_ptr<ConfigFileWorker> worker;
const bool Module1 = read_config_file(file, "Module1");
if (Module1) { // you check this only once during launch and just use `worker` all the time after
worker.reset(new WithModule1Worker);
} else {
worker.reset(new WithoutModule1Worker);
}
// here and after just use the pointer with `run()` - then you will not need to check the variable all the time, you'll just perform action.
}
因此,您已经为两种情况(true
和false
)预定义了行为,只需在启动时解析配置文件时创建其中一种情况的对象。这是java-like
代码,但当然您可以使用函数指针、std::function
和其他抽象来代替基类,然而,在我看来,基类选项具有更大的灵活性。
- 无法找到/读取配置文件.conf-FileIOException
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 一种在C++中读取TXT配置文件的简单方法
- FFMPEG配置文件级别id大小无效
- 配置文件解析器仅返回以前的值
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- Boost program_options将多个配置文件解析结果存储到一个parsed_options中
- Windows 后台服务(系统配置文件)无法使用 C++ 访问 win 10 上的用户 appData 文件夹?
- 我应该如何获取配置文件的绝对路径与 Windows .exe一起发布?
- JPG-如何从ICC配置文件部分APP2读取/提取数据
- 检测到 Conan 配置文件设置与 CMake 之间的编译器版本不匹配
- boost::p rogram_options 配置文件格式
- 如何在Boost::program_options配置文件中为非字符串的自定义选项值类型处理空格
- 如何在 Boost Program_Options 中使用命令行和分层配置文件的选项
- 如何将不可编译的配置文件添加到QT工程中?
- OpenGL不能在核心配置文件中使用glVertexAttrib进行绘制
- 如何使用 c++ 实现并发文件/文本编辑?
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 配置文件的实现
- "SASLprep" C++ 中"stringprep"实现的配置文件