所以,标题。众所周知,编写C ++程序是可能的,这需要无限的时间来编译(理论上)。但是有可能在普通C中编写这样的程序吗?或者有没有办法通过一个小程序将编译时间减慢到至少几分钟?
答案 0 :(得分:1)
以下是您要求的示例,宏指数增加。
#define FOO i++ // Substitute any statement here for i++
#define FOO1 FOO ; FOO
#define FOO2 FOO1 ; FOO1
#define FOO3 FOO2 ; FOO2
#define FOO4 FOO3 ; FOO3
#define FOO5 FOO4 ; FOO4
#define FOO6 FOO5 ; FOO5
// Keep going however much you want
...
#define FOO40 FOO39 ; FOO39
volatile int i;
int main(void)
{
FOO40; // This expands to 2^40 statements.
}
我使用FOO18
进行时序测试,看看会发生什么。我分别测试了预处理器时间和编译时间:
(Preprocessor phase)
time gcc -E foo.c -o foo.i
1.7 seconds
(Compilation phase)
time gcc foo.i -o foo
21 seconds
出于好奇,我不断尝试越来越大的价值观。不幸的是,在某些时候编译器内存不足(预处理器很好)。我收到了这个错误:
cc1:在总共403505152字节之后分配16842751个字节的内存不足
在FOO16
-O2
,我能够在不耗尽内存的情况下获得2:23的编译时间。因此,如果您希望获得更长的编译时间,首先要找出许多可以放入单个函数的语句,而不会耗尽内存(FOO16
对我来说)。然后制作几个函数,如:
int main(void)
{
FOO16;
}
void bar1(void)
{
FOO16;
}
void bar2(void)
{
FOO16;
}
// etc...
答案 1 :(得分:1)
实验上,如果您要求最近的GCC或Clang/LLVM使用optimizations 编译某些包含单个(或极少数)C函数的C代码( s)有数千个语句,编译时间正在增长。
通过经验,使用单个函数的gcc -O2
进行编译,包含数千个C语句需要与 square <成比例的时间/ em>语句数量(更准确地说是预处理和放大后Gimple语句的数量)。
直觉解释说,寄存器分配,指令调度和中端优化的算法通常比 O(n)更差;天真的非优化C编译器,如tinycc,nwcc,8cc
等,没有这样的时间行为(但生成的代码真的比gcc -O2
差...)
dlopen
它,以表明您可以{{1成千上万的共享对象)。阅读它的源代码,它将说明我的观点。
更严重的是,我(过去)在旧版MELT中尝试了同样的问题,它生成了适合GCC扩展的C ++代码。我不得不在几个例程中拆分一些巨大的顺序初始化代码。
您可以使用dlopen
编译这么大的函数来更准确地理解编译器花费时间的优化过程。
最后,如果你想要一个小的源代码,可以通过询问gcc -ftime-report -O2
来欺骗,但我认为这不算数。
答案 2 :(得分:1)
#include __FILE__
大多数编译器可能会提前纾困,但从理论上讲,这会导致无限编译。
#include "/dev/tty"
在支持它的系统上,这会导致编译器等待输入。同样,您可以使用命名管道。
编译器可能存在逻辑错误,导致它永远循环。