C语言中的函数内部静态与C ++中类中的静态之间的区别?

时间:2017-08-28 20:45:51

标签: c++ c static

我在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;
};

上述两个代码段之间有什么区别? 上面的C ++代码在任何方面都优于C代码吗?

2 个答案:

答案 0 :(得分:0)

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

你的功能也是如此。任何调用者都将与相同的静态变量进行交互。

但是,根据您的编译器,它们在多线程环境中的行为方式肯定存在一些模糊性(您是使用新编译器编译纯c函数还是混合c / c ++?)

基本上,初始化在C ++ 11之前并不是线程安全的,如果两个线程到达本地静态变量的初始化(或后续修改),你就会得到数据争用。这一直存在于微软方面的Visual Studio 2015之前。

因此,在现代编译器中,C ++的行为方式不同。

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

  

如果控件在变量的同时进入声明   在初始化时,并发执行应等待完成   初始化。

答案 1 :(得分:0)

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