为什么要在C++中明确声明"inline"
Why explicitly state "inline" in C++
可能重复:
我应该什么时候写关键词';inline';对于函数/方法?
所以这个问题困扰了我一段时间,我无法得到确切的答案。我的理解是,一个好的编译器通常会意识到,当内联一个函数既安全又有利时,如果启用优化,它会内联所有这些函数,无论它们是否被程序员明确标识为内联函数。此外,编译器会意识到何时内联函数是不安全/不明智的,并且在这种情况下会忽略程序员对内联函数的请求。
因此,我想知道将函数明确声明为内联的好处是什么?只要打开了优化,编译器就会内联它认为合理的所有函数,并且只内联那些函数。
我发现了一些关于内联保护的讨论,因为嵌套的h文件导致了多个定义,但肯定#ifdefine在标题源代码中是更好的做法,并再次导致关键字内联无效?
您对编译器优化非常了解。你对inline
的假设是错误的。尽管inline
这个名字不是为了优化。inline
主要是"违反"一个定义规则而不受惩罚。基本上,它告诉链接器,许多翻译单元都可以看到这个定义,所以它不应该在多个翻译单元上找到它。
有些编译器可能会将其视为内联函数的提示,但这完全取决于编译器,忽略该提示是完全有效的。
标头保护仅针对同一翻译单元上的多个定义提供保护。它们不跨翻译单位工作。
头保护不能防止多个定义错误。
链接器会遇到多个定义,并且当同一定义包含在单独的编译单元中时会出现多个定义。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 激励'inline'说明符的真实世界示例?
- C++中的"inline"关键字
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 为什么要在C++中明确声明"inline"
- 替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]