__inline__ 是否会改变 local static variable 的行为?

💡 原文中文,约18500字,阅读约需44分钟。
📝

内容提要

本文讨论了使用__inline__和__attribute__((always_inline))修饰函数时,对函数中的static变量的影响。文章指出,__inline__和__attribute__((always_inline))并不会改变static变量的行为,因为编译器会决定是否进行内联,应该将NS_INLINE函数视为静态函数。文章建议尽量不要在头文件中声明静态函数,除非清楚其用途。

🎯

关键要点

  • __inline__ 和 __attribute__((always_inline)) 不会改变 static 变量的行为。

  • 编译器决定是否进行内联,__inline__ 不能简单理解为宏打开。

  • 建议不要在头文件中声明 static 函数,除非明确其用途。

  • NS_INLINE 函数在正常情况下会默认为 static 属性。

  • 在同一个 Compile Unit 中,static 函数的 static 变量是共享的,但在不同 Compile Unit 中则不是。

  • static 函数内的 static 变量在每个 Compile Unit 中都有一份副本。

  • 正常函数的 static 变量在所有 Compile Unit 中共享一份。

  • 使用 __inline__ 可以避免链接时的多重定义错误,但不保证内联成功。

  • 如果 __inline__ 失败,可能会变成 weak symbol,不会引起链接错误。

  • 总结:static 变量的行为与函数的定义方式密切相关,需谨慎使用。

延伸问答

__inline__ 和 __attribute__((always_inline)) 对 static 变量的行为有什么影响?

__inline__ 和 __attribute__((always_inline)) 不会改变 static 变量的行为,编译器决定是否进行内联。

为什么不建议在头文件中声明 static 函数?

在头文件中声明 static 函数会导致每个引入该头文件的编译单元都有一份副本,可能导致包大小增长和多重定义问题。

同一个 Compile Unit 中的 static 函数的 static 变量是如何共享的?

在同一个 Compile Unit 中,static 函数的 static 变量是共享的,只有一份副本。

不同 Compile Unit 中的 static 函数的 static 变量有什么区别?

在不同 Compile Unit 中,static 函数的 static 变量不是共享的,每个 Compile Unit 都有一份自己的副本。

使用 __inline__ 可以避免什么问题?

使用 __inline__ 可以避免链接时的多重定义错误,但不保证内联成功。

NS_INLINE 函数的默认属性是什么?

NS_INLINE 函数在正常情况下默认为 static 属性。

🏷️

标签

➡️

继续阅读