【问题标题】:Should static member functions be avoided in shared libraries?共享库中是否应该避免使用静态成员函数?
【发布时间】:2012-11-06 05:23:11
【问题描述】:

在阅读 Oliveira 和 Stewart 的《Writing Scientific Software》一书时,我偶然发现了这段有趣的段落:

"共享变量是危险的,应该在共享库中避免使用

因此,如果您正在编写共享或动态链接库,请避免使用 staticsaved 局部变量并避免使用全局变量。”

(第 55 页)

但是static 成员函数呢?这些在共享库中是否同样危险?我也应该避免这些吗?为什么/为什么不?

【问题讨论】:

  • 作者给出的原因是代码不会重入;也就是说,让多个应用程序运行同一个 DLL 是有风险的,因为静态/全局变量会被共享。
  • 感谢您澄清这一点。
  • 关于静态成员/变量和共享;共享库中的一个用例是全局事件和线程ID。这很容易导致线程安全。其他静态成员通常最好放置在对其上下文敏感的类/结构内的库的关联头文件中。同时,您总是希望对您在全球空间中的位置非常严格。

标签: c++ c static global-variables shared-libraries


【解决方案1】:

但是static 成员函数呢?这些在共享库中是否同样危险?

一点也不:不应该避免static成员函数:与代表共享状态的static变量不同,static成员函数代表共享计算。只要这些计算是无状态的,它们就完全没有危险。

【讨论】:

  • 变量是可变的,静态成员函数和简单函数一样是不可变的。所以无论有什么问题变量,函数都不会共享它。
【解决方案2】:

静态函数不是问题。事实上,科学软件中常用的许多函数都是纯数学函数,例如sin()sqrt()log()

另一方面,静态变量是共享状态的指标,应该避免使用。

【讨论】:

    【解决方案3】:

    不是天生的。不使用任何静态状态的静态成员函数(例如,仅使用局部变量或线程局部变量的成员函数)并不是不安全的。此类方法经常用于备受推崇的库中,例如 boost 或 guava(Java 世界的最后一个示例)。

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 2018-10-08
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多