是否可以在编译时初始化数组,以便在运行时不会花费时间?
Is it possible to initialize an array at compile-time so it doesn't take time at run-time?
例如,如果我想创建多达200万个Eratosthenes的筛,那么在运行时需要一些时间。有没有一种方法可以通过使用元编程来减少运行时间?
筛选代码(将std::bitset初始化为const MILLION
(:
void initCiur(std::bitset<MILLION> &c)
{
c[0] = c[1] = 1;
for (int i=4; i <= MILLION; i+=2)
c[i] = 1;
for (int i=3; i*i <= MILLION; i+=2)
if (!c[i])
for (int j=3*i; j <= MILLION; j+=2*i)
c[j] = 1;
}
有没有一种方法可以通过使用元编程来减少运行时间?
当然可以。我理解";元编程";与任何生成代码的程序一样(不仅仅是聪明的C++模板(
在大多数C++实现中(例如,如果在某些GNU/Linux操作系统上使用某些最新的GCC编译器(,C++翻译单元实际上是一个文本文件。另请阅读C++11标准n3337。
因此,只需将您的构建自动化工具(例如GNU make或ninja(配置为在构建时生成(可能使用Python或Guile脚本,或您的C++元程序(一些C++文件,或其他地方的#include
-d文件。或者写你的GCC插件这样做。
顺便说一句,这个想法并不新鲜:ANTLR和GNU bison或Qt或SWIG都是这样做的(最近的GCC编译器,例如GCC 10,有十几个专门的C++代码生成器(。我放弃的GCC MELT项目就是这么做的。RefPerSys和bismon也是如此(对于哈希表中有用的素数,这两个项目都是我开始的(。primes_rps.cc
文件的部分内容已由机器生成(请参阅其中的注释(。
在某些的情况下,一个聪明的优化编译器可以优化constexpr
。请注意Rice定理,该定理指出,巧妙地优化并不总是可能的。另见本报告草稿。
您也可能对代码生成库(如asmjit或libgccjit(感兴趣,或者对在运行时生成插件感兴趣(在Linux上,您将使用dlopen(3(和dlsym(3(,但首先阅读C++dlopen mini howto,然后如何编写共享库(。
PS。对于其他操作系统(如Windows(和C++编译器,情况可能会有所不同,但上面的大多数想法都是可重用的。阅读C++编译器和操作系统的文档。在交叉编译方法中,您可能需要更多技巧。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 使用 4 个和 8 个线程运行时执行的时间相等
- 在运行时分配已发布属性的确切时间?
- 在C STD中,如何在运行时选择计时持续时间
- 上限time_point到运行时定义的持续时间
- 为什么未达到的 try-catch 块会增加运行时时间
- 使用表达式:如何最小化运行时构造时间
- 在编译时间(或运行时)获取C 功能的名称
- C 构造函数运行时/编译时间
- 运行时计时函数和命令行时间之间的差异
- 是否值得在任何地方使用策略而不是条件(需要运行时检查来编译时间)
- 编译时间和运行时以C++为单位
- C++在运行时崩溃,但只是部分时间
- 如何在运行时监控进程的资源使用情况(时间、内存)?
- 性能问题与c++(使用vc++ 2010):在运行时,我的程序似乎随机等待一段时间