首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是编译时分支?

什么是编译时分支?
EN

Stack Overflow用户
提问于 2014-07-31 09:53:21
回答 2查看 527关注 0票数 6

有哪些技术/ c++语言工具--提供编译时分支的特性?

第一次尝试枚举它们(我期待添加-更正):

  1. 重载解决方案:(如选择适合提供的参数的“最佳”版本) 真空F(X& arg);虚F(X& arg);
  2. 模板专门化:创建为“特殊参数”运行的代码--这是模板元编程和编译时递归的关键技术。 模板结构A{ /*实现*/ };template<>结构A<0> { /*特定代码*/ };
  3. SFINAE & expression :(1)为条件接口提供工具的特例。 template自动测试( c,f) ->解密类型((c->*f)(),void());// 'C‘是指针类型
EN

回答 2

Stack Overflow用户

发布于 2014-07-31 23:26:39

您可以使用模板布尔参数来消除运行时分支(在发布版本中消除了死代码)。

代码语言:javascript
复制
template <bool computeMaxNorm = false>
bool CheckConvergence() {

    if (computeMaxNorm) this->residual_max_norm = 0;

    for (size_t i = 0, I = this->X.Count(); i < I; ++i) {
        double abs_res = abs(this->F_X[i]);
        if (abs_res > this->convergenceCriterion) {
            this->isConverged = false;
            if (!computeMaxNorm) return false;
        }
        if (computeMaxNorm) {
            if (abs_res > this->residual_max_norm) this->residual_max_norm = abs_res;
        }
    }
    return this->isConverged = true;
}

problem.CheckConverge<false>()将比problem.CheckConverge<true>()更快,而且此特性不需要运行时分支。

然而,CPU分支预测器通常是非常好的,编译时分支可能没有什么区别。

票数 2
EN

Stack Overflow用户

发布于 2014-07-31 10:14:42

虽然不是严格地编译时分支,但您可以添加第四个选项:

4) C++

代码语言:javascript
复制
  #if SOMETHING
    ...
  #else
    ...
  #endif
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25055879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档