zoukankan      html  css  js  c++  java
  • 函数重载-name mangling或mame decoration技术-看看反汇编

    函数重载

    文件-创建新项目-空项目 源文件-右键新建项-main.cpp

    #include <iostream>
    using namespace std;
    
    int main() {
    
        getchar();
        return 0;
    }
    
    • c语言不支持函数重载
    • C++支持函数重载
    #include <iostream>
    using namespace std;
    
    int sum(int v1, int v2){
        return v1 + v2;
    }
    
    int main() {
    
        cout << sum(10, 20) << endl;
     
        getchar();
        return 0;
    }
    

    现在希望sum函数多一些接收的参数

    #include <iostream>
    using namespace std;
    
    int sum(int v1, int v2){
        return v1 + v2;
    }
    
    int sum(int v1, int v2, int v3){
        return v1 + v2 + v3;
    }
    
    int main() {
    
        cout << sum(10, 20) << endl;
        cout << sum(10, 20, 30) << endl;
     
        getchar();
        return 0;
    }
    
    • 两个函数的函数名一模一样,但是后面的参数或类型或顺序不同,称之为过程重载(函数重载)
    • 实参的隐式转换会产生恶意性

    函数重载的本质是采用name mangling或mame decoration技术

    • C++编译器默认会对符号名(比如函数名)进行改编、修饰。有的翻译术语叫(命名倾轧),掌握前面的编译器干了什么,如何命名不管它。因为,可能翻译的人就想使用原本的英文,但是领导驳回,于是强行翻译的术语就出现了。

    • 编译器偷偷把一样的函数名重命名了,反汇编看看它们
      F9打上断点 调试-开始调试 一旦进入到断点模式就可以右键进入反汇编 alt+G

    我们发现在汇编还是没有进一步看见重命名的情况,只是发现了内存地址不同

    这个时候需要借助其他的工具,比如IDA Pro(逆向工程/反汇编)

    debug模式:很多调试信息,生成的可执行文件比较臃肿
    release模式:去除调试信息,生成的可执行文件比较精简、高效

    release模式-解决方案右键属性-C/C++优化-优化-禁用

    默认参数

    C++允许函数在声明中 设置默认参数,调用时根据情况省略实参。函数重载和默认参数一起可能会产生冲突,二义性

    #include <iostream>
    using namespace std;
    
    int sum(int v1 = 5, int v2 = 6) {
        return v1 + v2;
    }
    
    int main() {
    
        cout << sum() << endl;
        cout << sum(10) << endl;
        cout << sum(10, 20) << endl;
    
        getchar();
        return 0;
    }
    

    指针存储函数名

    #include <iostream>
    using namespace std;
    
    void test(int a){
        cout << "test(int) - " << a << endl;
    }
    
    int main() {
        
        void(*p)(int) = test;
        p(10);
        
    
        getchar();
        return 0;
    }
    

    默认参数本质 看汇编

    这是正常的传参

    汇编使用push方式传参

    这是默认传参

    汇编都是一样的push

    汇编都一摸一样 自己调试观察

    sum(1);
    sum(1, 6);
    

    E8 都是call 八九不离十在visual studio中
    intel 机器码的白皮书 PDF

  • 相关阅读:
    跳台阶问题
    最大连续子数组和
    寻找和为定值的若干个数
    MySQL- 用Navicat通过隧道连接到远程数据库
    CDH- 测试mr
    Sqoop- sqoop将mysql数据表导入到hive报错
    CDH- CDH大数据集群运维
    Spring- 异常org.xml.sax.SAXParseException; systemId: http://www.springframework.org/schema/context/; lineNumber: 1; columnNumber: 55; 在 publicId 和 systemId 之间需要有空格。
    Spring- 通过Xml的方式完成Bean的实例化
    Spring- Bean的命名
  • 原文地址:https://www.cnblogs.com/sec875/p/12247050.html
Copyright © 2011-2022 走看看