yan*_*nce 1 c++ qt inline header
我正在制作一个Qt应用程序,当我编写代码时,我习惯于在标题中定义我的插槽.我发现虽然我仍然在.cpp中定义了正常的函数,但我更容易开发这种方式(除非函数非常小).但是现在我的同事有一些担心,将这些放在标题中是不好的做法,因为在标题中定义它们的事实使它们内联,所以我正在调查此事以理解正在发生的一切.这就是我被给予的原因:
"即使是内联函数(除了类所要求的)也是一个值得商榷的实践.理论上,它创建了更快但更大的代码(通过复制代码来避免函数调用和返回).但是,有些人注意到经常使用内嵌实际上会创建更慢的代码.原因是它可能导致代码变大并超出适合运行时使用的一个或多个缓存的大小.因此它会导致部分函数运行进出缓存每次通过一些循环并且缓存未命中和后续重新加载比对另一个缓存页面中的某些东西的函数调用要昂贵得多.这是一个有趣的情况,一个无法预测,只能通过试验观察到和错误."
jal*_*alf 24
您的同事需要检查C++中内联的含义.
这个词有两个含义,将它们分开是很重要的:
根据C++标准,函数是inline使用inline关键字标记,还是在类定义中定义.
唯一需要的效果是禁用一个定义规则 - 也就是说,使定义在多个转换单元中看到是合法的,而不会产生链接器错误.基本上,它允许您将完整定义放在头文件中
然后是"内联" 优化,它包括获取函数体,并插入它而不是函数调用.
这些含义几乎完全正交.编译器可以将函数内联,无论您是程序员是否将其标记为inline.(尽管如果函数在与定义函数的转换单元不同的转换单元中调用,但编译器内联函数更难且更少见.)inlineC++中标记的函数可能会也可能不会由编译器内联.编译器尝试根据代码大小,调用函数的频率,调用站点的数量和此类启发式来估计此可能的好处.结果是编译器非常擅长确定内联优化何时值得,而你最好的选择通常是让它独自完成它.
您应该简单地将函数标记为内联,1)方便您,2)您希望确保编译器可以选择应用内联优化.
但是你并没有强迫编译器内联任何东西.您只是安排代码,以便它可以,如果它选择这样做,内联函数调用.
由于这些方法是插槽,因此不会内联.根据定义,插槽由指向函数的指针调用.即使它们是内联显式声明的,编译器也必须为它们生成正常的函数代码,因此可以获取它们的指针.
唯一的问题(如果你这样看)是由于在包含你的类定义的所有编译单元中重新编译相同的方法然后在链接时删除重复版本而导致的编译时间更长.
正如其他人在C++中所说的内联并不意味着编译器会内联函数.反过来说:缺乏内联不会停止强烈优化编译器和链接器,当他们认为它会加速程序时内联一些函数.
C++中的内联对编译器只说了一件事: 这个函数在头文件中定义,因此它可以在多个编译单元中独立编译.这不是错误,所以不要发出任何错误或警告消息.相反,在合并期间,应将此函数的多个版本视为一个版本. 编译器甚至没有义务检查这些多个版本是否一致.