在C++ 11中使用函数指针

piah890a  于 2023-10-20  发布在  其他
关注(0)|答案(4)|浏览(134)

函数指针的主要原因是提供通用的可调用对象,但在C++ 11中提供它的方式是使用std::function,那么除了与C的兼容性之外,在现代C++中使用函数指针还有什么理由呢?换句话说,std::function是函数指针的现代版本吗,就像std::array与内置数组一样?

bd1hkmkf

bd1hkmkf1#

在POSIX系统上,你可以得到dlopendlsym,你可以用它们来从动态加载的插件中获取函数指针。
这是一个常见的用例,函数指针仍然有用,即使是C++14(参见例如。Qt
正如许多人所观察到的,闭包(或std::function)的实现通常需要额外的间接寻址和额外的运行时成本。

7gs2gvoe

7gs2gvoe2#

std::function对于大多数用例来说都非常方便和高效。但有一个缺失的功能:平等的
所以,每次你需要比较/过滤/搜索/排序std::function类对象时,你必须回到函数指针来实现你需要的东西。

ffscu2ro

ffscu2ro3#

是的,我几乎在任何地方都更喜欢std::function,但在一些情况下,std::function的大小开销和间接性可能是不可接受的。对于像封装在std::function中的函数指针这样的小可调用对象,通常没有额外的间接寻址,也没有动态内存分配,因为可调用对象适合std::function,但std::function可能很大,可以容纳更大的可调用对象,因此可能会有很大的空间开销。

neskvpey

neskvpey4#

老实说,我想不出在什么情况下需要std::function,原因如下。如果我在函数指针上来回跳动,那么我可能是在一个非常低的级别上工作。原因可能是C风格的继承被证明限制太多,所以我设计了自己的多态性。或者,我可能在一个小型嵌入式控制器上工作,在那里我真的剃掉了字节。无论哪种方式,我都将依靠自己,而不是编译器,来记住我有什么类型等。我基本上是在敲打金属,希望金属表现得像金属,而不是像天狼星控制论的电梯。
我可能需要std::function开销的唯一情况是,如果我试图做一些功能性的事情,比如杂耍闭包,但如果我想要这样,那么我不太可能使用C

相关问题