内联包含另一个函数的函数是否会导致内部函数被内联?
Will inlining a function containing another function cause the inner one to be inlined?
假设有一个调用自由函数的类成员函数:
class MyClass
{
public:
void func1() {func2();}
};
我很想知道是否有可能编译器将内联函数内部(func2
),因为func1
是内联的?
func2
是否内联取决于complex如何func2。func1是否内联取决于它在f2展开后的复杂程度(如果有的话)。
内联本质上是一种编译器优化,它不依赖于函数定义是否内联于源(因此可重复)。
取决于编译器和环境。
编译器决定内联函数基于:
- 代码的可见性。显然,它不能内联编译器没有源代码的函数[1]。
- 代码大小。与小函数相比,大函数不太可能内联。
- 一个函数被调用的次数。如果它是一个小函数,它可能被调用数百次,仍然是内联的,一个大函数调用不止一次,可能不是内联的。至少GCC有"函数只调用一次"的特殊情况——在这种特殊情况下,它甚至内联了巨大的函数。
因此,在这种情况下,如果func2
对编译器可见,并且足够小,编译器认为可以内联,那么它可能会。
绝对没有根据和理由存在这种联系。内联内部函数调用的问题与内联外部函数调用的问题是独立的。
回答你的问题:当然,内部调用被内联的可能性是存在的,但是,它与外部函数是否被内联无关。
应该注意的是,编译器决定是否内联函数的决策算法通常足够智能,以避免过度的代码膨胀,即避免生成过长的函数。这意味着在某些情况下,内联外部函数可能意味着内部调用将而不是被内联。
不,将func1
内联将不会自动导致 func2
内联;但是总是编译器将内联func2
的可能性,无论func1
是否内联。
内联行为完全由实现定义。编译器可以自由地忽略或尊重或使用自己的启发式来确定应该做什么。
有时编译器在没有被问到:编译器什么时候内联c++代码?
有时编译器会忽略它:https://softwareengineering.stackexchange.com/questions/35432/inline-functions-in-c-whats-the-point
相关文章:
- 在函数内部的声明中初始化数组,并在外部使用它
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- C++ SSE 内部函数:将结果存储在变量中
- C++代码停止工作错误使用cout内部函数
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 为什么从具有较大阵列的 SIMD 内部函数中获得的相对加速比标量更大?
- WriteProcessMemory 在函数内部失败
- 使用英特尔内部函数 (AVX) 中的混合说明
- 英特尔汇编与内部函数,AVX
- 如何在C++中传递lambda函数内部的对象实例
- 在析构函数内部处理异常(但不抛出)
- 使用SSE内部函数复制少量数据时出现问题
- 在函数内部传递字符 *str
- 仅在函数内部构建对象时EXC_BAD_ACCESS
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 用于平铺矩阵乘法的 AVX 内部函数
- 是否可以使用类的析构函数内部函数来重置值?
- 我在理解 AVX 随机内部函数如何为 8 位时遇到一些问题