【问题标题】:Does a C++ compiler inline functions based on usage? [duplicate]C++ 编译器是否根据使用情况内联函数? [复制]
【发布时间】:2016-06-14 10:18:26
【问题描述】:

我一直认为内联函数应该是短函数,否则可执行文件会因过多的相同代码副本而变得臃肿。

但是,我尝试重构我的代码并编写小的帮助函数,这些函数通常不是那么小(20-30 行),并且通常只被一个其他函数使用,例如避免使用do{...}while(false); 成语。

因此我的问题是:

  • 内联一个长函数不是一个好主意吗?可执行文件的大小相同,并且会保存一个函数调用。
  • 一个好的编译器会考虑这个吗?或者长度是不内联函数的一个强有力的标准。这是否取决于我是否明确写了inline,因为编译器似乎大多忽略了这一点?

【问题讨论】:

  • 现代编译器会忽略代码中的 inline 关键字。当他们认为有必要时,他们自己内联方法。
  • do{}while(false) 技巧是用来在宏中进行直观扩展的,为什么要在函数中使用呢?
  • 为什么要内联函数?速度,通常。但是,如果函数对于大的某些定义来说是“大”的,那么它并不完全适合指令流水线,你可能最终会出现缓存未命中......内联一个长函数会给你带来什么好处?
  • @Quentin 我猜 OP 想通过将函数转换为宏来让他的编译器别无选择。现在预处理器必须内联,以牺牲基于宏的解决方案为代价,这在所有方面都比内联差。
  • 何时进行内联由编译器自行决定(无论是否使用 inline 关键字)。它可能会忽略或假设inline,具体取决于其编译模型的实现方式。是的,当使用较少的次数时,一个好的编译器可以轻松地内联单个大函数(再次特定于编译器实现,如果 less = 1 或更多)。在链接的欺骗中,引用了另一篇文章,其中进一步讨论了这个概念。这是来自它的one good answer。一般来说,长度可能不是现代编译器内联的唯一标准。

标签: c++ inline


【解决方案1】:
  • 将函数保持在 40-60 行代码内(不包括 cmets/new-lines)。
  • 在函数中传递较少的参数,如果要传递的参数很多,则将它们打包到结构中,并通过引用传递struct。这减少了调用堆栈空间。
  • 不要过多地嵌套函数。最多 4-5 个嵌套级别就很好(switchwhileif 等)。如果超出此范围,请尝试通过 return 在函数内重构,更改条件、流程等。
  • 不要通过值传递大对象,通过引用传递它们。
  • 如果方法不使用任何数据成员,则将它们设为 static - 以避免 this 被从调用堆栈中推送和弹出。
  • 不要过度优化任何代码 - 让编译器为您完成。优化构建需要时间以针对目标平台以最佳方式优化代码。
  • 进行代码检测,并使用/部署检测代码。代码检测将改变代码流,使程序运行得更快。例如,如果检测发现raraly_true 大部分是错误的,则if(rarely_true) Dothis(); else DoThat(); 将在代码检测中反转。这是最简单的例子。

【讨论】:

  • 一个100行代码的函数很大——不小
  • 跟这个问题有什么关系?我询问编译器行为。尽管如此,所有的好规则!我一般都坚持。你能推荐一些我可以阅读代码检测的地方吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 2011-10-29
  • 1970-01-01
  • 2018-05-12
  • 2013-05-19
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多