PHP源码初探之GCC简单介绍(三)

本文详细解析了gcc编译c++程序的过程,包括预处理、编译、汇编和链接四个阶段,并强调了优化参数在提高程序效率中的作用。通过实例展示了如何在代码中使用gcc进行优化,并讨论了数据流分析在发现潜在问题的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据流分析

看一个例子

int getNumber(int x)
{
	int n;
	if (x > 0)
	  n = 1;
	else if (x< 0)
	  n = -1;
	return n;
}
上面的例子,有个问题,当x = 0的时候,将会出错;但是在使用gcc一般编译的情况下是不会报错的

gcc -Wall -c test.c
只有当使用优化处理参数,它就会提示错误

gcc -Wall -O2 -c test.c
uninit.c: In function ‘sign’:
uninit.c:3: warning: ‘s’ may be used uninitialized in this function
当打开优化开关后,它会做数据流分析;所以我们优化的时候使用-O参数可以找出隐藏比较深的参数

在这里有一点需要记住:思路越简单,代码越少,最容易看懂就是最好的程序


二、gcc编译c++程序

gcc是c++最好的编译器,它直接将c++转化成汇编语言;

gcc提供了gcc和g++两个不同的程序,但是gcc主要是对c语言,g++是对C++;gcc和g++都是外壳,它们的选项基本是一致的

#include <iostream>

int main()
{
    std::cout << "Hello World" <<std::endl;
    return 0;
}
gcc -Wall hello.cc -o hello // 报错:gcc: error trying to exec 'cc1plus': execvp: No such file or directory
g++ -Wall hello.cc -o hello

三、一个重点基本知识,编译原理,编译器是怎么工作的

有四个处理过程

  • Preprocessing预处理,去调用cpp扩展宏
  • Complation编辑阶段,将c的源程序编译为汇编语言
  • Assembly将汇编语言编译为机器吗,产生目标文件
  • Linking创建可执行的目标文件(这里要包含运行库,标准库)

我们从一个hello.c看上面四个步骤

#include <stdio.h>
int main(void)
{
    print_r("Hello World!\n");
    return 0;
}
第一步、预处理

cpp hello.c > hello.i // 把程序所有的宏都扩展开了

第二步、编译阶段

gcc -Wall -S hello.i // 只是把hello.i转换为汇编语言;编译器最复杂的工作

第三步、汇编器

as hello.s -o hello.o

第四步、连接

上面的代码中,printf是外部的,必须经过外部的连接才能使用

gcc hello.o


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值