C++笔记-从代码到可执行文件的四个阶段
.s文件、.S文件和.o文件的区别 https://blog.csdn.net/hao745580264_dawei/article/details/80751683
.s 汇编语言源程序; 操作: 汇编
.S汇编语言源程序; 操作: 预处理 + 汇编
C++从代码到可执行文件的四个阶段 https://www.cnblogs.com/dreammmz/p/13409800.html
对c程序来说使用
gcc name.c -o name.exe
执行命令后会生成可执行文件 name.exe。
对c++程序来使用
g++ name.cpp -o name.exe
执行命令后生成可执行文件name.exe。
C/C++学习 - gcc编译过程查看汇编代码 https://blog.csdn.net/alps1992/article/details/44737839
参数 | 说明 |
---|---|
-c | 只编译不链接,生成*.o文件 |
-S | 生成汇编代码*.s文件 |
-E | 预编译 生成*.i文件 |
-g | 在可执行程序里包含了调试信息,可用 gdb 调试 |
-o | 把输出文件输出到指定文件里 |
-static | 链接静态链接库 |
-library | 链接名为library的链接库 |
给一段代码
#include <functional>
#include <iostream>
#include <typeinfo>
#include <chrono>
//待封装的函数
int testEfficiency (int i, int j) {
for (size_t ii = 0; ii < 5; ii++) {
i += i - ii;
}
if (i < j)
return i + 7 * j;
else return i - 3 * j;
}
//待封装的函数
int testEfficiency2 (int i, int j) {
for (size_t ii = 0; ii < 5; ii++) {
i += i - ii;
}
if (i < j)
return i + 8 * j;
else return i - 2 * j;
}
typedef std::function<int (int, int) > FuncInt_IntInt;
using funcInt_IntInt = int (*) (int, int); //函数指针
int main(int argc, char** argv) {
int a = 1;
int c = a;
int testNum = 1E9;
funcInt_IntInt fFuncPtr = testEfficiency;
if (false) {
fFuncPtr = testEfficiency2;
}
std::cout << "函数原型类型:\t\t" << typeid (testEfficiency).name() << std::endl;
std::cout << "函数指针类型:\t\t" << typeid (fFuncPtr).name() << std::endl;
std::chrono::time_point<std::chrono::system_clock> start, end;
// PART-1: 直接调用方法
start = std::chrono::system_clock::now();
for (size_t i = 0; i < testNum; i++) {
a = testEfficiency (a, 2);
}
end = std::chrono::system_clock::now();
std::cout << "直接调用耗时:\t\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;
// PART-3: 函数指针
start = std::chrono::system_clock::now();
for (size_t i = 0; i < testNum; i++) {
c = fFuncPtr (c, 2);
}
end = std::chrono::system_clock::now();
std::cout << "使用函数指针耗时:\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "c=" << c << std::endl;
}
预处理: 生成.i 文件
g++ -E test_fun_ptr.cpp -o test1b.i -O2
编译: 生成.s文件
g++ -S test1b.i -o test1b.s -O2
汇编: 生成.o文件
g++ -c test.s -O2
g++ -c test.i -O2
链接: 生成可执行文件
g++ test.o -o test -O2