c++ - 依赖于 C++ 的编译器优化

标签 c++ optimization c++17

<分区>

问题:在编码时依赖编译器优化是否可以?

假设我需要计算 calculateFcalcuateG,它们都取决于 getValue 返回的另一个值。有时我需要这两个值,有时我只需要其中一个值。

// some function
double getValue(double value)
{
    double val(0.0);
    // do some math with value
    return val;
}

// calculateF depends on getValue
double calculateF(double value)
{
    double f(0.0);
    auto val = getValue(value);
    // calculate f which depends on val (and value)
    return f;
}

// calculateG depends on getValue
double calculateG(double value)
{
    double g(0.0);
    auto val = getValue(value);
    // calculate g which depends on val (and value)
    return g;
}

现在,我可以更优雅地写这个:

std::pair<double,double> calculateFG(double value)
{
    auto val = getValue(value);
    double f(0.0), g(0.0);
    // calculate f and g which depend on val (and value)
    return {f,g};
}

如果我想要两个值:

double value(5.3);
auto [f,g] = calculateFG(value); // since C++17
// do things with f and g

如果我只想要 1 个值,比如 f,我只是不使用 g,它将被优化掉。因此,如果我不使用 gcalculateFG 的性能与 calculateF 完全相同。此外,如果我同时需要 fg,我只需要调用一次 getValue 而不是两次。

代码更简洁(只有 1 个函数 calculateFG 而不是 calculateFcalculateG),如果同时使用 f 则速度更快code> 和 g 是必需的。但是依靠编译器优化是一个明智的选择吗?

最佳答案

智不智难说。这取决于编译器优化 - 函数内联。

  • 如果 calculateFG 是内联的,编译器可以优化掉未使用的。内联后,g 未被使用,因此生成 g 的所有代码都是死代码[1]。 (它可能不能,例如,如果计算代码有一些副作用)

  • 如果不是,我不认为可以应用优化(总是计算 fg)。

现在您可能想知道是否可以始终内联特定函数。

请注意,提供 inline 关键字不会强制编译器内联该函数。这只是一个提示。有没有关键字,都是编译器的调用。似乎有非标准的方式 - How do I force gcc to inline a function?

[1]相关编译器选项:-fdce -fdse -ftree-dce -ftree-dse

关于c++ - 依赖于 C++ 的编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640637/

相关文章:

c++ - 如何在 C++ 中正确地静态转换 vector ?

C++:字符串流解析

mysql - 在过滤不活跃用户(即没有任何交易)后,从拥有约 1000 万用户和交易的系统中获取旧的用户余额

c++ - experimental::optional nullopt_t 构造函数

c++ - 表示为一维的多维数组(为 n 维模板化)

c++ - 如何将其定义为宏?

c++ - 将由空格分隔的文件读入动态数组C++

php - 从 API 获取数据时诊断瓶颈

function - Scilab:optim 函数源文件位于何处

c++ - 链接 gcc 6、gcc 7 和 gcc 8 对象是否安全?