函数指针的主要原因是提供通用的可调用对象,但在C++ 11中提供它的方式是使用std::function,那么除了与C的兼容性之外,在现代C++中使用函数指针还有什么理由呢?换句话说,std::function是函数指针的现代版本吗,就像std::array与内置数组一样?
std::function
std::array
bd1hkmkf1#
在POSIX系统上,你可以得到dlopen和dlsym,你可以用它们来从动态加载的插件中获取函数指针。这是一个常见的用例,函数指针仍然有用,即使是C++14(参见例如。Qt)正如许多人所观察到的,闭包(或std::function)的实现通常需要额外的间接寻址和额外的运行时成本。
7gs2gvoe2#
std::function对于大多数用例来说都非常方便和高效。但有一个缺失的功能:平等的所以,每次你需要比较/过滤/搜索/排序std::function类对象时,你必须回到函数指针来实现你需要的东西。
ffscu2ro3#
是的,我几乎在任何地方都更喜欢std::function,但在一些情况下,std::function的大小开销和间接性可能是不可接受的。对于像封装在std::function中的函数指针这样的小可调用对象,通常没有额外的间接寻址,也没有动态内存分配,因为可调用对象适合std::function,但std::function可能很大,可以容纳更大的可调用对象,因此可能会有很大的空间开销。
neskvpey4#
老实说,我想不出在什么情况下需要std::function,原因如下。如果我在函数指针上来回跳动,那么我可能是在一个非常低的级别上工作。原因可能是C风格的继承被证明限制太多,所以我设计了自己的多态性。或者,我可能在一个小型嵌入式控制器上工作,在那里我真的剃掉了字节。无论哪种方式,我都将依靠自己,而不是编译器,来记住我有什么类型等。我基本上是在敲打金属,希望金属表现得像金属,而不是像天狼星控制论的电梯。我可能需要std::function开销的唯一情况是,如果我试图做一些功能性的事情,比如杂耍闭包,但如果我想要这样,那么我不太可能使用C。
4条答案
按热度按时间bd1hkmkf1#
在POSIX系统上,你可以得到dlopen和dlsym,你可以用它们来从动态加载的插件中获取函数指针。
这是一个常见的用例,函数指针仍然有用,即使是C++14(参见例如。Qt)
正如许多人所观察到的,闭包(或
std::function
)的实现通常需要额外的间接寻址和额外的运行时成本。7gs2gvoe2#
std::function
对于大多数用例来说都非常方便和高效。但有一个缺失的功能:平等的所以,每次你需要比较/过滤/搜索/排序
std::function
类对象时,你必须回到函数指针来实现你需要的东西。ffscu2ro3#
是的,我几乎在任何地方都更喜欢
std::function
,但在一些情况下,std::function
的大小开销和间接性可能是不可接受的。对于像封装在std::function
中的函数指针这样的小可调用对象,通常没有额外的间接寻址,也没有动态内存分配,因为可调用对象适合std::function
,但std::function
可能很大,可以容纳更大的可调用对象,因此可能会有很大的空间开销。neskvpey4#
老实说,我想不出在什么情况下需要std::function,原因如下。如果我在函数指针上来回跳动,那么我可能是在一个非常低的级别上工作。原因可能是C风格的继承被证明限制太多,所以我设计了自己的多态性。或者,我可能在一个小型嵌入式控制器上工作,在那里我真的剃掉了字节。无论哪种方式,我都将依靠自己,而不是编译器,来记住我有什么类型等。我基本上是在敲打金属,希望金属表现得像金属,而不是像天狼星控制论的电梯。
我可能需要std::function开销的唯一情况是,如果我试图做一些功能性的事情,比如杂耍闭包,但如果我想要这样,那么我不太可能使用C。