相比较于C中的函数指针,C++中function的优势在哪?

去百度看了一些博文,说C中的函数指针不安全,且速度没有function快,但大都停留在表面。
我想请教以下几个问题,希望有大佬能详细讲讲


1. 函数指针的不安全性体现在哪?

2.为什么function比函数指针快?

阅读 2.4k
1 个回答
  1. 函数指针的不安全性体现在哪?
  • 函数指针是指针,拥有很强的灵活性和随意性,可指向空地址和随机地址(非法地址)。此时调用程序直接崩溃,无任何提示信息,排查困难
  • function 语法上增加规范性,同时当出现调用异常时有捕获的可能(挽救程序奔溃)。即使崩溃,会有异常信息打印 bad_function_call ,依次在代码中检索 function 缩小排查区域
#include <iostream>
#include <functional>

using namespace std;

typedef void (*func_ptr)(int);

void func(int a)
{
    cout << a << endl;
}

void test1()
{
    cout << "test1 begin" << endl;

    // 函数指针可能指向空地址或随机地址(指向的地址都是非法的),此时调用将导致程序直接崩溃切无任何提示信息可靠调试
    func_ptr f = 0;  
    f(1);

    cout << "test1 end" << endl;
}

void test2()
{
    cout << "test2 begin" << endl;

    // 语法上的规范提示使用者需要注意
    // 出现异常时可捕获,挽救程序不奔溃
    // 即使崩溃,会有异常信息打印 bad_function_call ,依次在代码中检索 function 缩小排查区域
    function<void(int)> f; 

    try {
        f(1);
    }  catch (exception &exc) {
        cout << exc.what() << endl;
    }

    cout << "test2 end" << endl;
}

int main()
{
    //test1();

    test2();

    return 0;
}
  1. 为什么 function 比函数指针快?
  • 原生的函数指针更快,function 是一个类模板,最终作为一个对象被调用【()操作符重载】,编译、运行开销更大

👇

  • function 更重要的意义是降低代码编写的随意性增加规范性,同时对多态也有更好的支持
  • 指针灵活,对底层拥有极强的操作能力,但这也会导致野指针、访问越界、内存泄漏等等问题,因此现在语言 java、C# 等都取消了对指针的支持
  • C++是C的进阶保留了指针,但C++中更推荐使用智能指针避免原生指针的使用,const_cast、reinpret_cast关键词、引用等也是C++语言层面对规范使用指针的努力
推荐问题