gpt4 book ai didi

c++ - 编译器是否优化了对通过指针进行的琐碎函数的调用?

转载 作者:IT老高 更新时间:2023-10-28 22:13:39 25 4
gpt4 key购买 nike

假设我有一个带有函数指针的函数:

int funct(double (*f)(double));

我给它传递了一个实际上不做任何事情的函数:

double g(double a) { return 1.0;}
//...
funct(g);

编译器会优化对 g 的调用吗?或者这仍然会有开销?如果确实有开销,多少钱?是否值得重载函数以同时接收函数指针和常量值?

最佳答案

较新版本的 GCC(4.4 及更高版本)可以使用选项 -findirect-inlining 内联和优化已知函数指针。这仅在 GCC 也知道所有使用该指针的代码时才有效。

例如,C 库函数 qsort不会从这种优化中受益。 qsort 的编译机器代码在库中,它需要一个函数指针,编译器无法更改它。

但是,如果您有自己的 qsort 实现并将其放置在头文件中,或者您使用了非常新的 GCC 链接时优化功能,那么 GCC 能够接听您的电话代码、指向的函数和您的 qsort 源代码,并将它们全部编译在一起,针对您的数据类型和比较函数进行了优化。

现在,唯一真正重要的是函数调用开销远大于函数本身。在您的函数示例中,使用函数指针是严重的开销。在我的 qsort 比较示例中,函数指针调用也非常昂贵。但在 Windows 事件分派(dispatch)等其他应用程序中,这并不重要。

由于您使用的是 C++,因此您应该学习模板。模板函数可以接受所谓的function object,它只是一个实现operator() 并且的对象,它可以接受函数指针。传递一个函数对象将允许 C++ 编译器内联和优化几乎所有涉及的代码。

关于c++ - 编译器是否优化了对通过指针进行的琐碎函数的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6259466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com