• 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

  • 相关阅读:
    c#项目架构搭建经验
    c++ template怎么使用及注意事项
    c++怎么将一个类,拆分出接口类,和实现类
    c++l类
    错过C++
    Fixed 鸟粪一样的TreeView下的NodeMouseDoubleClick Bug
    Oracle 12C 新特性之表分区带 异步全局索引异步维护(一次add、truncate、drop、spilt、merge多个分区)
    Oracle 12C 新特性之在线重命名、迁移活跃的数据文件
    Oracle 12C 新特性之级联truncate
    Oracle 12C 新特性之扩展数据类型(extended data type)
  • 原文地址:https://www.cnblogs.com/gnivor/p/15657309.html
Copyright © 2020-2023  润新知