《gcc五分钟系列》第十节:编译期优化选项(一)——pipe

    上一节讲到,从源代码生成最终的可执行文件需要四个步骤,并且还会产生中间文件。
    可是我们在对一个源文件编译的时候,直接执行g++ xxx.cpp能够得到可执行文件a.out,但是并没有中间文件啊!中间文件在哪里?
    答案是,在/tmp目录下。想看吗?跟着我做。
    1、在终端中执行g++ xxx.cpp。
    2、在另外一个终端中执行ls /tmp/cc* 2>/dev/null。
    看见什么了?什么也没有啊!说明你太慢了。
    你需要在第一个命令完成前,执行第二个命令,否则什么也看不见。你大概只有不到0.1秒的时间。
    写一个脚本来看吧。

 
  
  1. #!/bin/bash 
  2. g++ main.cpp & 
  3. sleep 0.05 
  4. ls --color=auto /tmp/cc* 


    在我的电脑上,时间是0.05的时候可以看到如下结果:
/tmp/cc9CD8ah.o   /tmp/ccj9uXNd.s
    可以看到,有.s汇编文件,.o目录文件。
    所以,实际上gcc将中间文件放在了/tmp目录下,并且在编译完成后会将其删除。
    可是这样有一个问题,读写文件都是IO操作,效率上会不会很慢?
    我们需要将上一步的结果交给下一步处理,有没有什么比较快的方法?
    如果您了解linux的话,会立即想到一个牛X闪闪的东西:管道。
    将上一步编译的结果通过管道传递给下一步,这不需要IO操作,全部在内存中完成,效率上会有非常大的提高。
    gcc提供了这个功能,方法是使用-pipe选项。
    g++ -pipe main.cpp
    下面是gcc的man手册中关于-pipe选项的解释:

 
  
  1. -pipe 
  2.     Use pipes rather than temporary files for communication between the 
  3.     various stages of compilation.  This fails to work on some systems 
  4.     where the assembler is unable to read from a pipe; but the GNU 
  5.     assembler has no trouble. 


   
    本节完。