zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Azure存储账户的日志分析方法
    导出zabbix监控数据
    centos7下kubernetes(18。kubernetes-健康检查)
    centos7下kubernetes(17。kubernetes-回滚)
    unity接入安卓SDK,与安卓相互通信
    (转)坐标 旋转 计算
    矩阵运算试验
    photonServer学习之连接数据库
    C#委托链
    git命令大全
  • 原文地址:https://www.cnblogs.com/gnivor/p/15657309.html
Copyright © 2011-2022 走看看