一邊走路一邊學習 關於struct和class的區別等幾個知識點總結

1. volatile作用:
volatile是易變的、不穩定的意思。用它修飾的變量表示可以被某些編譯器未知的因素更改,比如:OS、hardware或者其他線程等;遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對特殊地址的變量的穩定的訪問。什麼叫做“不再進行優化”呢?例如:
int i = 10;
int j = i; //1語句
int k = i; //2語句
這個時候編譯器將對變量i進行優化:在1語句執行時,從內存中取出i的值並賦值給j之後,這個值並沒有被丟掉,而是在2語句中繼續用這個值給k賦值。編譯器不會生成彙編代碼並從內存中取出i的值,提高了效率。而我們定義:volatile int i = 10;之後,就是要告訴編譯器:我這個i隨時都可能發生變化,這個數據可能是共享數據,供多線程訪問的,或者是一個端口數據,你每次使用它的時候千萬別偷懶,要從內存中取出i的值,這樣才保險。所以,編譯器也就老老實實的每次都生成彙編代碼並重新從i的地址中讀取數據放到k中。
問題:const volatile int i=10;這行代碼有沒有問題?
答案:它是volatile,因爲它可能被意想不到地改變;它是const,因爲程序不應該試圖去修改它。volatile和const並不矛盾,只是控制的範圍不一樣,一個在程序本身之外,另一個是程序本身。

 

2. C++中struct和class的區別
a. 成員默認訪問權限不同:class默認是private,而struct默認是public;
b. 默認繼承權限不同:如果不明確指定,類的繼承權限是private,
而struct的繼承權限按照public來處理。
c. struct是一種數據結構,而class則體現OOP思想中的“封裝”的特性。
d.struct可以用{}來賦初值,class則不行。
另外,空結構體的sizeof()是多少?
答案:1,而不是0。

4. 大小端模式
首先,讓我們先來了解一下數據的存儲模式:大端模式和小端模式。
大端模式:字數據的高字節存儲在低地址中,而字數據的低字節則存在高地址中;
小端模式:字數據的高字節存儲在高地址中,而字數據的低字節則存在低地址中。
例如32位數據0x3a ad 77 0f的大小端存儲方式如下:
          高-------低
大端存儲:f0 77 da a3
小端存儲:3a ad 77 0f

那麼如何自己寫個程序來檢測自己電腦的處理器是大端模式還是小端模式呢?
假設int i = 1;
          低---------------高
大端模式:0x0   0x0  0x0  0x1
          高---------------低
大端模式:0x0   0x0  0x0  0x1
分析:變量i佔4個字節,其中一個字節爲1,兩外三個都是0,如果取出低地址上的值爲0,那麼毫無疑問,這是大端模式;如果取出低地址上的值爲1,那麼則爲小端模式。我們可以利用union類型數據的特點:所有成員的起始地址一致,這個很重要;另外union數據結構還有什麼特點?
union數據結構的空間利用率高,數據成員共用一個空間,同一時間只能存儲其中一個數據成員。空間大小的配置爲成員中數據類型最長的那個值。
程序如下:
int CheckSystem(void)
{
    union check
    {
        int i;
        char ch;
    }c;
   
    c.i = 1;
    return(c.ch == 1)
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章