配置文件的实现

时间:2016-01-01 10:55:28

标签: c++ configuration

我在C ++中创建一个应用程序,它需要一个在启动时读取和解释的配置文件。它将包含诸如以下内容:

Module1=true

现在,我最初的计划是将所有内容存储在变量中,只需要

If(module1) {
    DO_STUFF();
}

然而,这似乎是浪费,因为它会不断检查一个永远不会改变的值。有什么想法吗?

6 个答案:

答案 0 :(得分:1)

只有在发现有分析器的瓶颈时才优化代码。 分支预测 是一个明显的性能损失。

如果你想进行实验,你可以分支一次,并使指针指向正确的函数:

module1

但这只是个人资料,看看大会......

您可以使用更慢,但更舒适的方式存储配置,例如:在具有枚举索引或地图的数组中。如果我在循环中得到一些价值,我会这样做:

using func_ptr = void (*)();
func_ptr p = [](){};

if(module1)
    p = DO_STUFF;

while(...)
    p();

所以我最终会得到你已经拥有的东西。

答案 1 :(得分:1)

根据程序的设置方式以及变量如何改变代码行为,您可以使用函数指针:

if(Module1 == true)
{
   std::function<void(int)> DoStuff = Module1Stuff;
}

然后是:

while(true)
{
    DoStuff(ImportantVariable);
}

有关详细信息,请参阅http://en.cppreference.com/w/cpp/utility/functional/function

不是说我觉得它会帮助那么多,但它至少可以尝试。

答案 2 :(得分:1)

如果您知道所检查值的所有用例,则可以解决此问题。例如,如果您已阅读配置文件且module1true - 您执行了一项操作,如果它是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.
}

因此,您有2个案例(truefalse)的预定义行为,并且在启动时解析配置文件时只创建其中一个对象。这是java-like代码,但当然你可以使用函数指针,std::function和其他抽象而不是基类,但是,基类选项在我看来更灵活。

答案 3 :(得分:0)

性能明智的布尔检查没有问题,除了你开始做数百万或数十亿次。也许你可以开始合并属于module1的代码,但除此之外,你必须像现在一样检查它

答案 4 :(得分:0)

这真的不是问题。如果您的程序要求Module1应该为true,那么让它检查值并继续。除非经过多次检查,否则它不会影响您的表现。

如果被检查的次数太多,你可以做的就是制作一个内联函数。但是,你必须确保该功能不应该太大,否则它将成为一个更大的瓶颈

答案 5 :(得分:0)

对不起伙计们,我查看时没有发现这个: MDSN 所以我在启动时检查一次布尔值,然后我就不再需要了,因为只启动了正确的函数。