最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中全局變量的初始化全過程

 更新時(shí)間:2024年08月21日 10:13:13   作者:vcpro126  
這篇文章主要介紹了C++全局變量的初始化全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++全局變量的初始化過程

全局變量在main()前完成初始化(調(diào)用構(gòu)造函數(shù))

在調(diào)用構(gòu)造函數(shù)前,全局變量已分配空間,內(nèi)存全0

多個(gè)全局變量的初始化,按照代碼編譯的順序

注意:全局變量被訪問前可能它還沒有調(diào)用構(gòu)造函數(shù)初始化。

如果一個(gè)項(xiàng)目中,多個(gè)dll都用到一個(gè)全局變量在共同的lib中,則每個(gè)dll都有一個(gè)獨(dú)立的全局變量(地址不同),每個(gè)全局變量會(huì)初始化。

如下代碼,A里面訪問了全局變量g_b, 改變?nèi)肿兞縢_a,g_b的順序 會(huì)導(dǎo)致g_b.b的輸出結(jié)果不同。

如按照A g_a; B g_b 的順序定義,編譯器會(huì)先調(diào)用A()時(shí),這時(shí)g_b還沒有調(diào)用B(), g_b.b=0,然后賦值 g_b.b=101;

然后調(diào)用B(),g_b.b的值被改成1.

#include <istream>
using namespace std;

class B {
 public:
  int b = 1;
};

extern B g_b;
class A {
 public:
  int a = 0;
  A() {
    g_b.b = 101;
  }
};

#if 0
B g_b;
A g_a;
#else
A g_a;
B g_b;
#endif
int main() {
  printf("g_b=%d\n", g_b); //AB: g_b=1; BA: g_b=101
  return 0;
}

C++全局變量初始化的順序

雖然一直強(qiáng)調(diào)不要用全局變量。但是對于特殊的應(yīng)用場合,還是有全局變量的使用(如某些多進(jìn)程、多線程的共享資源),我們希望在首次運(yùn)行(載入)時(shí),系統(tǒng)能夠幫助我們進(jìn)行一些必要的初始化。

If a program starts a thread (30.3), the subsequent initialization of a variable is unsequenced with respect to the initialization of a variable defined in a different translation unit. Otherwise, the initialization of a variable is indeterminately sequenced with respect to the initialization of a variable defined in a different translation unit. If a program starts a thread, the subsequent unordered initialization of a variable is unsequenced with respect to every other dynamic initialization. Otherwise, the unordered initialization of a variable is indeterminately sequenced with respect to every other dynamic initialization

對不同的源文件中的全局變量,標(biāo)準(zhǔn)C++對全局變量初始化的順序并沒有要求。對于同一個(gè)原文件中,全局變量按照定義先后順序初始化。

對于堆類型的全局變量的創(chuàng)建和構(gòu)造,可能在一個(gè)構(gòu)造函數(shù)中調(diào)用另一個(gè)未構(gòu)造的全局變量,通常會(huì)檢查另一個(gè)指針是否有效,并在無效時(shí)構(gòu)造那個(gè)對象。這就出現(xiàn)一個(gè)問題:

一個(gè)指針在構(gòu)造之前,被初始化。c/c++運(yùn)行時(shí),仍然會(huì)再次構(gòu)造那個(gè)指針(全局變量為空指針)。

這會(huì)引發(fā)資源泄露,甚至運(yùn)行時(shí)錯(cuò)誤。

解決措施。雖然按需創(chuàng)建是一種很好的思路。但是必須符合c/c++運(yùn)行機(jī)制。解決方式就是不使用堆創(chuàng)建對象,而是使用棧內(nèi)存對象(c++內(nèi)部大使用致雙檢查鎖的方式保證構(gòu)造一次)。我們也可以自己實(shí)現(xiàn)雙檢查鎖的思路,但是我們使用的鎖的創(chuàng)建過程,本身就是需要雙檢查鎖定的,這是自相矛盾的。

參考C++標(biāo)準(zhǔn)具體介紹:(原文:Storage class specifiers - cppreference.com

Variables declared at block scope with the specifier static or thread_local (since C++11) have static or thread (since C++11) storage duration but are initialized the first time control passes through their declaration (unless their initialization is zero- or constant-initialization, which can be performed before the block is first entered). On all further calls, the declaration is skipped.

If the initialization throws an exception, the variable is not considered to be initialized, and initialization will be attempted again the next time control passes through the declaration.

If the initialization recursively enters the block in which the variable is being initialized, the behavior is undefined.

If multiple threads attempt to initialize the same static local variable concurrently, the initialization occurs exactly once (similar behavior can be obtained for arbitrary functions with std::call_once).

Note: usual implementations of this feature use variants of the double-checked locking pattern, which reduces runtime overhead for already-initialized local statics to a single non-atomic boolean comparison.

(since C++11)

The destructor for a block-scope static variable is called at program exit, but only if the initialization took place successfully.

Function-local static objects in all definitions of the same inline function (which may be impli

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)

    C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入VC回調(diào)函數(shù)的使用詳解

    深入VC回調(diào)函數(shù)的使用詳解

    本篇文章是對VC回調(diào)函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++之vector內(nèi)存釋放原理

    C++之vector內(nèi)存釋放原理

    這篇文章主要介紹了C++之vector內(nèi)存釋放原理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 淺析C++中memset,memcpy,strcpy的區(qū)別

    淺析C++中memset,memcpy,strcpy的區(qū)別

    本篇文章是對C++中memset,memcpy,strcpy的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • c語言 sscanf,scanf,fscanf正則表達(dá)式用法

    c語言 sscanf,scanf,fscanf正則表達(dá)式用法

    每種語言都對正則表達(dá)式有著不同程度的支持,在C語言中,有輸入功能的這三個(gè)函數(shù)對正則表達(dá)式的支持并不強(qiáng)大,但是我們還是有必要了解一下
    2018-04-04
  • C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解

    C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解

    消息隊(duì)列在多線程的場景有時(shí)會(huì)用到,尤其是線程通信跨線程調(diào)用的時(shí)候,就可以使用消息隊(duì)列進(jìn)行通信。本文將利用C++實(shí)現(xiàn)一個(gè)簡單的消息隊(duì)列,感興趣的可以了解一下
    2022-12-12
  • C++中多線程的執(zhí)行順序如你預(yù)期嗎

    C++中多線程的執(zhí)行順序如你預(yù)期嗎

    這篇文章主要為大家詳細(xì)介紹一下C++中多線程的執(zhí)行順序的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++多線程有一定幫助,需要的可以參考一下
    2022-10-10
  • 淺談C++空間配置器allocator

    淺談C++空間配置器allocator

    在STL中,Memory Allocator處于最底層的位置,為一切的Container提供存儲(chǔ)服務(wù),是一切其他組件的基石。對于一般使用 STL 的用戶而言,Allocator是不可見的。本文將主要介紹C++空間配置器allocator
    2021-06-06
  • 深入理解Qt信號槽機(jī)制

    深入理解Qt信號槽機(jī)制

    信號槽是 Qt 框架引以為豪的機(jī)制之一。本文主要介紹了Qt信號槽機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總

    基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總

    這篇文章主要介紹了基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法,非常經(jīng)典,需要的朋友可以參考下
    2014-08-08

最新評論

彩票| 隆子县| 怀来县| 兴业县| 金阳县| 田林县| 潢川县| 长海县| 曲水县| 淄博市| 乌拉特前旗| 红原县| 临安市| 当雄县| 文化| 靖江市| 治多县| 桦川县| 塘沽区| 宁都县| 石首市| 徐闻县| 蓬安县| 女性| 新和县| 如东县| 昆山市| 兰考县| 崇义县| 旌德县| 垣曲县| 都兰县| 安塞县| 唐山市| 上思县| 江安县| 肇东市| 和田市| 闽侯县| 凯里市| 万载县|