2017-08-28 54 views
-4

我在C中有一個類似於下面的預先存在的源代碼。C中的函數內的靜態和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代碼嗎?

+0

注意C代碼也是非常好的C++代碼。 –

+0

你爲什麼這樣做?原來的功能很好,因爲它是。具有單個靜態函數和靜態成員的類不會添加任何值,除非您通過代碼行獲得付款,否則沒有理由執行此操作。請注意,同樣的問題用不同的方式表示(例如,C++中這兩種方法之間的區別)會有一個有效的答案。 – SergeyA

+2

[C++,靜態局部變量(方法)和全局(文件)變量之間的區別是什麼?](https://stackoverflow.com/questions/31578571/c-what-is-difference-between-static- local-variablemethod-vs-globalfile-va) – rustyx

回答

0

它有點類似。任何與您的類MyClass的任何實例進行交互的人都將與相同的變量標誌進行交互。

您的功能也是如此。任何調用者都將與相同的靜態變量進行交互。

但是,肯定是在他們的言行舉止在多線程環境取決於你的編譯器(你編譯純粹的C函數或混合的C/C++有新的編譯器?)有些含糊

基本上,在C++ 11之前,初始化不是線程安全的,如果兩個線程到達本地靜態變量的初始化(或後續修改),您將獲得數據競爭。這一直存在,直到微軟方面的Visual Studio 2015。

因此,在現代編譯器上,C++的行爲有所不同。

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

如果控制進入申報的同時,而變量是 被初始化,併發執行必須等待初始化完成 。

0

沒有整個上下文,很難說哪個更好,這只是一個抽象問題。即使在程序集級別上,也無法區分它們,靜態變量在兩種情況下都會轉到.BSS段,並且邏輯完全相同,因爲您的方法是靜態的(並且假設它是您擁有和調用的唯一方法) ,它不會利用隱藏的"this" argument或在任何時候都有構造函數調用。 您只能通過在調試模式下編譯代碼並解釋生成的損壞名稱來區分差異。