Back to TILs

C++ - otimização com constexpr

Date: 2020-05-04Last modified: 2023-03-06

A linguagem C++ possui o conceito de expressões constantes (p.e. 1+2, 3*4) que SEMPRE produzem o mesmo resultado sem nenhum efeito colateral. Se o compilador puder diretamente otimizar e embutir esta expressões no programa em tempo de compilação teremos um ganho de performance.

#include <iostream>
#define LEN 10
int len_foo() {
    int i = 2;
    return i;
}
constexpr int len_foo_constexpr() {
    return 5;
}

// Pode ser usado em recursão
constexpr int fibonacci(const int n) {
    return n == 1 || n == 2 ? 1 : fibonacci(n-1) + fibonacci(n-2);
}

int main() {
    char arr_1[10];                      // legal
    char arr_2[LEN];                     // legal
    int len = 10;
    // char arr_3[len];                  // ilegal
    const int len_2 = len + 1;
    constexpr int len_2_constexpr = 1 + 2 + 3;
    // char arr_4[len_2];                // ilegal, mas aceito por vários compiladores
    // len_2 apesar de constante não é formado somente por constantes
    char arr_4[len_2_constexpr];         // legal
    // char arr_5[len_foo()+5];          // ilegal
    char arr_6[len_foo_constexpr() + 1]; // legal
    // 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
    std::cout << fibonacci(10) << std::endl;
    return 0;
}

Referências