【问题标题】:Difference between Static inside a function in C and Static inside a class in C++?C中函数内部的静态与C ++中类中的静态之间的区别?
【发布时间】:2017-08-28 20:45:51
【问题描述】:

我有一个预先存在的 C 源代码,类似于下面。

bool getFlag(int param)
{
  static bool flag = false;
  if(param == 1)
    flag = true;
  return flag;
}

I have written the C++ version of the same as below.
class MyClass
{
  public:
    static bool getFlag(int param)
    {
      if(param == 1)
        flag = true;
      return flag;
    }
  private:
    static bool flag;
};

上面两个代码sn-ps有什么区别? 上面的 C++ 代码在任何方面都优于 C 代码吗?

【问题讨论】:

  • 请注意,C 代码也是非常好的 C++ 代码。
  • 你为什么这样做?原来的功能很好。具有单个静态函数和静态成员的类不会增加任何价值,除非您通过代码行获得报酬,否则没有理由这样做。请注意,同一个问题的措辞不同(例如,这两种方法在 C++ 中的区别)会有一个有效的答案。
  • 类中的static 变量意味着所有类实例和后代共享一个实例。函数中的static 变量仅对函数可见,并且在执行离开函数后变量是持久的。类中的static 方法不需要类的实例来执行函数;类似于独立式功能。
  • @Neil Butterworth - “注意 C 代码也是非常好的 C++ 代码” - 我不会走那么远。当然,在 许多 的情况下,这是正确的。但是也有很多情况下,完全相同的代码在 C 和 C++ 下具有不同的语义。到目前为止,它们确实不同的语言,与 C11 和 C++17 相比,自 C89/C++98 以来,语法和语义相同的公共子集已经缩小了很多。

标签: c++ c static


【解决方案1】:

有点类似。与您的 MyClass 类的任何实例交互的任何人都将与相同的变量标志进行交互。

您的函数也是如此。任何调用者都将与同一个静态变量进行交互。

但是,它们在多线程环境中的行为肯定存在一些歧义,具体取决于您的编译器(您是在编译纯 c 函数还是使用新编译器编译混合 c/c++?)

基本上,在 C++11 之前,初始化不是线程安全的,如果两个线程到达局部静态变量的初始化(或后续修改),就会出现数据竞争。这一直存在,直到 Microsoft 方面的 Visual Studio 2015。

因此,在现代编译器上,C++ 的行为有所不同。

https://stackoverflow.com/a/11711991/128581

如果控制同时进入声明,而变量是 正在初始化,并发执行将等待完成 初始化。

【讨论】:

    【解决方案2】:

    如果没有整个上下文,很难说哪个更好,这只是一个抽象问题。即使在汇编级别,您也无法区分,静态变量在两种情况下都进入 .BSS 段,并且逻辑完全相同,因为您的方法是静态的(假设它是您拥有和调用的唯一方法) ,它不使用隐藏的"this" argument 或在任何时候调用构造函数。 您只能通过在调试模式下编译代码并解释生成的错误名称来区分。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2017-08-25
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2014-10-31
      相关资源
      最近更新 更多