【问题标题】:Preprocessor Directive for Repeated Code Blocks (with condition)重复代码块的预处理器指令(带条件)
【发布时间】:2014-04-02 02:08:57
【问题描述】:

在 C++ 中有什么方法可以实现类似以下伪代码的概念吗?

#pragma REPEAT

for (;;)
{
    // code block #1

    #pragma REPEAT_CONDITION(a==1)
        // code
    #end_pragma

    // code block #2
}

#end_pragma

这会被编译成这样:

if (a == 1)
{
    for (;;)
    {
        // code block #1

        // code

        // code block #2
    }
}
else
{
    for (;;)
    {
        // code block #1

        // code block #2
     }
}

这里的目标是通过从内部循环中抽象出一个条件来生成一段易于阅读的性能代码。因此不必手动维护重复的代码块。

【问题讨论】:

    标签: c++ performance c-preprocessor


    【解决方案1】:

    老实说,预处理器现在应该用于条件编译和其他宝贵的东西。借助内联(-建议)函数,疯狂地优化编译器和枚举,它们最常见的用例已逐渐消失。

    我在这里假设您不想每次通过循环都检查条件,即使这会大大清理您的代码:

    for (;;) {
        // code block #1
        if (a == 1) {
            // code
        }
        // code block #2
    }
    

    我能想到你这样做的唯一原因是不进行多次检查的额外速度,但你可能想要真正检查它的影响。除非// code 简单得可怜,否则它很可能会淹没单个条件语句的效果。

    如果您出于某种原因确实需要单独的循环,则最好将这些通用代码块放入函数中并使用单行代码简单地调用它们:

    if (a == 1) {
        for (;;) {
            callCodeBlock1();
            // code
            callCodeBlock2();
    } else {
        for (;;) {
            callCodeBlock1();
            callCodeBlock2();
        }
    }
    

    【讨论】:

    • 我遇到的最常见的情况是将相同的图像处理技术应用于不同的图像类型 - 例如。 RGB vs 单色 vs 二进制。通常,在这种情况下,“条件代码”块很小,正如您所指出的那样,使得条件和代码之间的比率差异非常小。此外,在处理图像时,还涉及到多嵌套循环。这一切加起来就是在实时环境中每秒可以处理的对象数量。
    • 您上面的解决方案可能会保持性能提升 - 假设函数是内联的 - 但(在我看来)对代码可读性没有太大作用。此外,通常使用优化的图像处理函数,往往会涉及许多变量,这使得调用函数很痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2018-03-22
    • 2020-01-22
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多