c – 我可以停止使用“inline”吗?
这个问题在这里已经有一个答案:>
what is/are the purpose(s) of inline?9个
由于完全由编译器决定是否内嵌函数,所以我可以完全停止使用这个关键字(假设它将内联所有内容). 解决方法
您可以停止使用内联作为优化技术.
内联基本上只有当您想要ODR (One Definition Rule)不适用时才有用.简而言之,您可以将函数标记为内联,并直接在一个头文件中提供其定义,然后由多个翻译单元导入,而无需链接器就此提出以下问题: foo.hpp inline int foo() { return 42; } Foo.cpp中 #include "foo.hpp" // <== THE LINKER WOULD COMPLAIN IF foo() WERE NOT inline,// because its definition is imported also in main.cpp void bar() { int x = foo(); } main.cpp中 #include "foo.hpp" // <== THE LINKER WOULD COMPLAIN IF foo() WERE NOT inline,// because its definition is imported also in foo.cpp int main() { std::cout << foo(); } 内联关键字的存在(再次不保证编译器将执行内联)可确保链接器将合并这些定义. 当然,为了使这个合并操作是有意义的,标记为内联的功能的所有定义都必须是相同的.如果不是这种情况,您的程序具有Undefined Behavior,并且不需要诊断 – 这意味着您的编译器/链接器不需要检测到这种不一致,并告诉您有什么不对! 根据C11标准的第3.2 / 4段,其实:
请注意,您可以在不同的翻译单元中具有标记为内联和字面定义两次的相同功能,只要这些定义相同即可. Foo.cpp中 inline int foo() // Has the same body in main.cpp,no problem! { return 42; } main.cpp中 inline int foo() // Has the same body in foo.cpp,no problem! { return 42; } int main() { std::cout << foo(); } 但是,如果两个定义不同,您将在代码中注入UB,如以下示例所示: Foo.cpp中 inline int foo() { return 42; // <== WATCH OUT! Different body in main.cpp } main.cpp中 inline int foo() { return -42; // <== WATCH OUT! Different body in foo.cpp } int main() { std::cout << foo(); } 这就是为什么当您通常将#定义的头文件直接提供给它们时,通常将函数标记为内联. 还要注意,类定义中直接内联的类成员函数将自动标记为内联. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |