相关疑难解决方法(0)

如何确保某些代码被优化掉?

tl;dr:能否以某种方式确保(例如通过编写单元测试)某些东西被优化掉,例如整个循环?

确保生产版本中不包含某些内容的常用方法是将其包装为#if...#endif. 但我更喜欢继续使用 C++ 机制。即使在那里,我也喜欢保持简单的实现,而不是复杂的模板专业化,并认为“嘿,编译器无论如何都会优化它”。

上下文是汽车中的嵌入式软件(二进制大小很重要),编译器通常很差。它们在安全意义上得到了认证,但通常在优化方面表现不佳。

示例 1:在容器中,元素的销毁通常是一个循环:

for(size_t i = 0; i<elements; i++)
    buffer[i].~T();
Run Code Online (Sandbox Code Playgroud)

这也适用于内置类型,例如int,因为标准允许显式调用任何标量类型的析构函数 (C++11 12.4-15)。在这种情况下,循环不执行任何操作并被优化掉。在 GCC 中是这样,但在另一个(Aurix)中不是,我在反汇编中看到了一个字面上的空循环!因此需要模板专门化来修复它。

示例 2:代码,仅用于调试、分析或故障注入等:

constexpr bool isDebugging = false; // somehow a global flag
void foo(int arg) {
    if( isDebugging ) {
        // Albeit 'dead' section, it may not appear in production binary!
        // (size, security, safety...)
        // 'if constexpr..' not an option (C++11)
        std::cout << "Arg was " << arg << std::endl;
    }
    // …
Run Code Online (Sandbox Code Playgroud)

c++ unit-testing dead-code compiler-optimization c++11

6
推荐指数
2
解决办法
1269
查看次数

跳转到if(false)块是否有任何问题?

我已经读过好几次了(例如,这里的编译器:如果条件始终为true / false怎么办),任何像样的c ++编译器都会选择退出

if(false)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

但是,如果有意跳入此if(false)障碍该怎么办。我有这样的想法

#include <iostream>

void func(int part){
    switch (part) {
    case 0:{
        if(false)
            case 1:{std::cout << "hello" << std::endl;}
        break;
    }
    default:
        break;
    }
}

int main()
{
    func(0);
    func(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何体面的C ++编译器会尊重这种跳跃,还是最终会在退出时出现一些问题?

c++ duffs-device

5
推荐指数
1
解决办法
128
查看次数

标准if/else在编译时已知的条件?

我知道C++中的一些元编程技术可以在编译时计算常量.元函数中的大多数时间分支是通过三元运算符完成的,可以在编译时以与标准if/else相反的方式进行评估.

但是关于这种功能:

template <unsigned int N>
void f()
{
    if (N == 0) {
        // Some computations here
    } else if (N <= 42) {
        // Some computations here
    } else {
        // Some computations here
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器会做什么(假设-O3)?编译器知道f<0>()将始终在第一种情况下f<32>()分支,将始终在第二种情况下f<64>()分支,并且将始终在第三种情况下分支.

编译器会删除永远存在的分支false吗?它会直接分支到唯一有效的案例吗?

c++ optimization templates if-statement c++11

3
推荐指数
1
解决办法
868
查看次数

我可以安全地假设if(true)和if(false)将被优化吗?

在我的代码中,我有一个带bool value模板参数的函数.除了一行之外,在truefalse案例中函数的实现几乎完全相同.所以我想我会if(value)发表一个声明,以避免重写相同的函数两次.调用函数时,value在编译时确定,因此if语句缩减为a if(true)或a if(false).现在,我想知道:这是安全的假设,任何合理的编译器(比如说g++,clang++...)将优化这种说法?

是的,性能至关重要,是的,功能非常轻巧,因此即使是单一的if也会影响速度,是的,这个功能需要在许多人类赖以生存的实时设备上执行数万次.

c++ optimization g++ clang++

0
推荐指数
1
解决办法
387
查看次数