<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何高效使用C語言

          共 2378字,需瀏覽 5分鐘

           ·

          2022-05-27 03:25

          來自:李山文的博客

          鏈接:https://lishanwen.cn/index.php/2021/06/27/effectiveclanguage/

          使用static關鍵字

          static關鍵字有兩個作用,對于變量而言,表示該變量是一個靜態(tài)變量,放在數(shù)據(jù)段中,即使函數(shù)運行結束,其變量也仍然存在。對于函數(shù)而言,表示該函數(shù)的作用域僅在該文件中,其他文件不可訪問,這樣有一個好處,就是當該文件僅僅只被本文件中的函數(shù)調用時,此時使用static關鍵字修飾可以避免其他函數(shù)因函數(shù)名相同而報錯,也就是當使用該關鍵字修飾時,即使兩個文件中的函數(shù)名完全相同,也不會報編譯錯誤,例如下面有兩個.c文件,分別是fun1.c和fun2.c。這兩個文件中有函數(shù)swap,函數(shù)名完全相同。這樣我們可以這樣使用static關鍵字:


          //fun1.c
          static?void?swap(int?*a,int?*b)
          {
          ????int?temp;
          ????temp=*a;
          ????*a=*b;
          ????*b=temp;
          }


          //fun2.c
          static?void?swap(int?*a,int?*b)
          {
          ????int?temp;
          ????temp=*a;
          ????*a=*b;
          ????*b=temp;
          }


          上面兩個文件中有完全一樣的函數(shù),函數(shù)只能在各自的文件中使用。

          使用const關鍵字

          const關鍵字的是constant的意思,即不變的,在C語言中作為關鍵字來告訴編譯器變量是不可修改的。


          修飾變量


          修飾普通變量


          const用來修飾普通變量表示該變量的值不可修改,也就是只讀。比如現(xiàn)在定義一個const a=10,則a的值后面將不可修改。


          const?int?a=10;??//初始化
          a=20?????????//錯誤,a的值不可修改


          修飾指針變量


          const用來修飾指針變量表示該指針的值不可修改,由于指針有兩個值可以修改,一個是指針的值,即指向的位置,另一個是指針指向的位置的值,為了區(qū)分這兩個值是否能修改,編譯器規(guī)定采用”就近原則“,即const修飾的是離const最近的。


          int?a=1,b=2;?const?int?*p=&a;
          //修飾的是int?*,即表示指針解引不可修改,也就是指針指向的值不能修改,等價int?const?*p=&a;?
          *p=10;
          //錯誤,p指針指向的值不可修改
          p=&b;
          //正確,沒有改變p指向變量的值。
          int?*?const?q=&a;
          //修飾的是指針q,即指針q指向的位置不可修改
          q=&b;
          //錯誤,q指向的位置不可修改
          *q=20;
          //正確,沒有修改q指向的位置


          修飾數(shù)組


          const用來修飾數(shù)組表示該數(shù)組的所有值將不得修改,一般編譯器看到一個const數(shù)組會將該數(shù)組存放在代碼區(qū)中,也就是.text段,這樣該數(shù)組將是只讀數(shù)據(jù)。


          const?int?a[4]={1,2,3,4};
          a[1]=20;?//錯誤,a數(shù)組所有的元素均不可修改??a數(shù)組為read?only,放在代碼段中

          地址對齊

          變量地址對齊


          地址對齊是一個非常重要的概念,現(xiàn)代編譯器提高代碼的執(zhí)行速度(主要是配合cache),默認將地址都按照4字節(jié)對齊,也即是一個字對齊。我們現(xiàn)在看下面一個結構體:


          struct?test
          {

          ????char?a;
          ????int??b;
          }


          如果不了解地址對齊概念的讀者可能會認為上面的結構體一共占1+4=5個字節(jié),實際上是占8個字節(jié),編譯器會按4字節(jié)對齊,由于a變量只占一個字節(jié),后面的b變量占4個字節(jié),如果只給a一個字節(jié)地址,編譯器會檢測到b變量的地址并不是按4字節(jié)對齊的,因此編譯器會默認將分配給b變量的地址向后偏移3個字節(jié),這樣b變量的地址正好的四字節(jié)對齊。


          #include?
          struct?test
          {

          ????char?a;
          ????int??b;
          };
          int?main(int?argc,?char?**argv)
          {
          ????struct?test?a;
          ????printf("size?of?struct?test??is?=%d\n",sizeof(a));
          ????return?0;
          }




          結構體sshshishi’jshi’ji實際結構


          因此在定義一個結構體時為了盡可能節(jié)約空間,必須考慮字節(jié)對齊問題。下面我們來對比兩個結構體:


          #include?
          struct?A{
          ????int????a;
          ????char???b;
          ????short??c;
          };
          struct?B{
          ????char???b;
          ????int????a;
          ????short??c;
          };
          int?main(int?argc,?char?**argv)
          {
          ????struct?A?st1;
          ????struct?B?st2;
          ????printf("size?of?st1?is=%d\n",sizeof(st1));
          ????printf("size?of?st2?is=%d\n",sizeof(st2));
          ????return?0;
          }


          運行后結果如下:



          兩個完全一樣的結構體,僅僅只是變量存放的位置不同導致其最終所占的空間不同,這就是字節(jié)對齊帶來的結果。顯然結構體A要節(jié)約內存。



          指針地址對齊


          既然指針是變量,那是否可以對指針進行位運算呢?比如將指針的值最后一位清零:p&=(~(1)),理論上應該是可行的,因為指針本來就是變量,但實際上編譯器不樂意了,它認為這樣導致指針指向的地址太隨意了,沒有嚴格遵循比類型空間大小,這就導致指針沒辦法進行位運算操作,理論上位運算和算術運算是有等價關系的,因此也可以自己實現(xiàn)指針位運算,這個在C++運算符重載中可能比較方便,因此這里不詳細談指針的位運算了。


          版權申明:內容來源網絡,版權歸原創(chuàng)者所有。除非無法確認,都會標明作者及出處,如有侵權,煩請告知,我們會立即刪除并致歉!


          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃一区二区三区蜜臀色欲 | 久夜午爱免费视频 | 国产内射小视频 | 日韩中文字幕第一页 | 亚洲成人人体艺术在线观看 |