《gcc五分钟系列》第十节:编译期优化选项(一)——pipe
上一节讲到,从源代码生成最终的可执行文件需要四个步骤,并且还会产生中间文件。
可是我们在对一个源文件编译的时候,直接执行g++ xxx.cpp能够得到可执行文件a.out,但是并没有中间文件啊!中间文件在哪里?
答案是,在/tmp目录下。想看吗?跟着我做。
1、在终端中执行g++ xxx.cpp。
2、在另外一个终端中执行ls /tmp/cc* 2>/dev/null。
看见什么了?什么也没有啊!说明你太慢了。
你需要在第一个命令完成前,执行第二个命令,否则什么也看不见。你大概只有不到0.1秒的时间。
写一个脚本来看吧。
- #!/bin/bash
- g++ main.cpp &
- sleep 0.05
- 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选项的解释:
- -pipe
- Use pipes rather than temporary files for communication between the
- various stages of compilation. This fails to work on some systems
- where the assembler is unable to read from a pipe; but the GNU
- assembler has no trouble.
本节完。
转载于:https://blog.51cto.com/elephantliu/684257