如何写一份代码让编译器编译很久

这个周末有幸见到了几位神交已久的库友(天天/迪迪/丁丁),大家一起扯了些有的没的,很开森!

丁丁又提起我曾经提出的那个问题“如何写一份代码让编译器编译很久?”

我记得当时我在群里提出这个问题时,波波和我首先想到的是利用C++的模板,让模板递归嵌套,或许会编译很久。

我测试发现gcc在模板递归嵌套500层之后就报错退出了,这个法子行不通。

后来我换了个法子达到了编译很久的目的,原理超级简单,一看代码便知:

template <unsigned A, unsigned B>
struct S {
    static const unsigned V = S<A, B-1>::V + S<A+(1<<(B-1)), B-1>::V;
};

template <unsigned A>
struct S<A, 0> {
    static const unsigned V = 1;
};

int main() {
    return S<0, 32>::V;
}
时间: 2024-11-11 04:24:54

如何写一份代码让编译器编译很久的相关文章

C代码通过编译器编译成可执行文件, 需经历 预处理、编译、汇编、链接 四个阶段

内容借鉴 于yqzheng 一.预处理 1.任务: 进行宏定义展开.头文件展开.条件编译, 不检查语法 2.命令: gcc -E [源文件] -o [预处理文件] gcc -E hello.c -o hello.i 二.编译 1.任务: 将预处理文件 编译成 汇编文件 检查语法 2.命令: gcc -S [源文件] -o [汇编文件] gcc -S hello.c -o hello.s 三.汇编 1.任务: 将汇编文件 生成 目标文件 2.命令: gcc -s [汇编文件] -o [目标文件]

代码在线编译器(上)- 编辑及编译

此文已由作者姚太行授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在线编译器 代码在线编译器,即在线代码编写运行工具,提供给用户在线代码编辑.代码提示.代码诊断.编译.运行等一系列从代码编写到启动运行过程中必要的功能服务,以达到IDE的核心功能,应用范围较广,从使用场景下大致分为两类: 一般场景 功能基础:仅基于开发语言的语法特点及常用原生库. 内容描述:此应用场景下,对一些涉及IO,诸如读写.外部请求等极端操作类型支持程度较高,代码运行环境通常使用沙箱,以满足安全性需

编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)

正在学PE结构...感谢个位大哥的文章和资料...这里先说声谢谢 一般高级编译器都是编译好的PE头部,例如MASM,TASM等一直都说NASM,FASM是低级编译器.可以自定义结构但是苦于无人发布相关文章说明..我这里就简单的用NASM写一下由于刚学PE结构许多东西都不太懂希望个位大侠指点如何打造一个迷你的PE结构..我暂只只能作到617字节下面随着学习的深入...还有更迷你的PE出现... 代码可以直接编译..编译参数:nasmw -fbin MsgBoxA.asm -o MsgBoxA.ex

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语

四则运算编译器,虽然说功能很简单,只能编译四则运算表达式.但是编译原理前端部分几乎都有涉及,词法分析,语法分析,还有代码生成. 再复杂的编译器.再简单的编译器,功能上是差不多的,只是复杂的编译器实现上会更困难. 这个系列的文章是为了帮助你入门,在这个基础上再去看编译原理相关书籍,不至于打瞌睡. 如果你对编译原理很有兴趣,并且想更深一步的学习,在这里强烈推荐你看一本书--我心目中的神书--<计算机系统要素-从零开始构建现代计算机>. 这本书神在哪? 神在它通俗易懂,对小白足够友好,但又不过分肤浅

gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C++编译器是集成的,编译一般分为四个步骤: 预处理(preprocessing)  ----------------- cpp/ gcc -E  编译(compilation) ------------------ cc1 / gcc -S 汇编(assembly)  ----------------

怎样在Windows和Linux下写相同的代码

目前,Linux在国内受到了越来越多的业内人士和用户的青睐.相信在不久的将来,在国内为Linux开发 的应用软件将会有很大的增加(这不,金山正在招兵买马移植WPS呢).由于未来将会是Windows和Linux两强鼎立的格局,怎样能够使得开发的软件保持最大的可移植性就成了一个很重要的问题.小弟经过一段时间的摸索,找到了这个问题的圆满解答. 在Linux下,所有的开发工具和库都属于自由软件,可以免费获得并且功能强大.如果这些工具和库都有相应的Windows版,那么我们就能够在Windows和Linu

Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2版本后)

本来这个问题真的没必要写的,可是真的困扰我太久%>_<%,决定还是记录一下. 首先,最权威清晰的安装文档还是官方的: Building the NetCDF-4.2 and later Fortran libraries (写此文时,最近版为4.2) 那这个文档最开始就告诉我们,自NetCDF库4.2版本以后,Fortran的库和C的库就要分开build啦!而且要装Fortran的库必须先装好C的库. 所以先装C的库咯:仍然官方文档: Getting and Building NetCDF-C

如何阅读一份代码?

https://zhuanlan.zhihu.com/p/26222486 ****************************** 上文谈到了像读书一样阅读源码的重要性,今天谈谈如何阅读一份代码.我所谓的一份代码,其范围可能从几千行到数万行,有时甚至可多达数十万行.这些代码作为一个有机体,共同完成某些重要的功能.比如说几个著名的 full fledged web framework,祖师爷 rails,师叔 django 和小师妹 phoenix: 三者对比很有意思 - rails / d

一个空类被编译器编译后产生了哪些默认函数

为何空类的大小不是0呢? 为了确保两个不同对象的地址不同,必须如此. 类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址. 同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了. 所以,空类的sizeof为1,而不是0. 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function, 如果你写 class A{}; 编译器处理后,就相当于: class A { public: A()