首页 > 解决方案 > 有没有办法提高涉及 const 表达式的编译速度?

问题描述

我写了一个程序,列出所有小于 n 且至少有 3 个不同素数除数的数。这里是

#include <cstdio>

using namespace std;

const int N = 1e6;
int n;
char arr[N];

int main(){
    for(int i = 2; i < N; i++) {
        if(!arr[i])
            for(int j = 2; i*j < N; j++) 
                arr[i*j]++;
    }
    scanf("%d", &n);
    for(int i = 30; i < n; i++) 
        if(arr[i] >= 3) 
            printf("%d ", i);
    printf("\n");
}

我注意到如果arr在程序开始时准备好我可以显着提高它的速度所以我写了这个

#include <cstdio>

using namespace std;

template<int N> 
struct A{
    char arr[N];
    constexpr A() : arr(){
        for(int i = 2; i < N; i++) {
            if(!arr[i])
                for(int j = 2; i*j < N; j++)
                    arr[i*j]++;
        }
    }
};

int main(){
    const int N = 1e6;
    constexpr auto a = A<N>();
    int n;
    scanf("%d", &n);
    for(int i = 30; i < n; i++) 
        if(a.arr[i] >= 3) 
            printf("%d ", i);
    printf("\n");
}

程序变得更快,但编译第二个版本大约需要 30 秒。不过,执行第一个版本只需要不到一秒钟的时间。有没有办法优化 constexpression 以减少编译时间,最好是接近执行程序的第一个版本的时间

标签: c++optimizationconstexpr

解决方案


推荐阅读