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

C/C++ memset方法的誤區(qū)

 更新時間:2021年04月15日 09:05:17   作者:李春港  
memset 作為對內存初始化的函數(shù),還是有不少坑和誤區(qū)的,今天就來對這個函數(shù)作一個總結。避免后期使用不當踩入坑,需要的朋友可以參考下

一、函數(shù)作用

最簡單的調用就是將一個數(shù)組清零,代碼如下:

const int maxn = 1024;
int a[maxn];
memset(a, 0, sizeof(a)); // 結果:a[0]=a[1]=a[...]=0;
  • 這里 sizeof(a) = maxn * 4 = 4096;
  • 表示的是將數(shù)組首地址 a 開始往后的 4096 個字節(jié),都設置為 0;

二、效率對比

直接調用 memset 接口清零 和 調用循環(huán)進行清零,進行一個測試后如下:

對長度為 10000000 的數(shù)組,執(zhí)行100次調用;

模式 memset for
debug 375ms 2156ms
release 343ms 329ms

  • 因為 release 版本會做各種優(yōu)化,編譯器發(fā)現(xiàn)重復執(zhí)行無效邏輯就會跳過,所以不太好造數(shù)據(jù)測試,研究時間效率的時候還是參考 debug 版本(當然,軟件發(fā)布的時候肯定用的是 release 版本)。
  • memset 無論從時間效率,還是代碼整潔來看都是由于 for 循環(huán)的,當然也帶來了一些容易引起誤解的地方。

三、誤區(qū)總結

1、按字節(jié)設置

memset 實現(xiàn)原理是根據(jù)字節(jié)來設置的,比如對于字節(jié)數(shù)組char a[100],將所有字節(jié)都設置為5,就可以調用:

memset(a, 5, sizeof(a));

但是,對于int b[100],也采用這種方法,就會導致錯誤:

memset(b, 5, sizeof(b));
  • 得到 b 數(shù)組中元素的值為 84215045;
  • 為什么呢?
  • 我們把這個數(shù)組轉換成二進制,得到:
  • ( 00000101 00000101 00000101 00000101 ) 2 (00000101 \ 0000 0101 \ 0000 0101 \ 0000 0101)_2 (00000101  00000101  00000101  00000101)2
  • 因為 i n t int int 占據(jù)了 4 4 4 個字節(jié),把每個字節(jié)都設置成了5,所以最后轉成十進制就變成了 84215045;
  • 同理,當類型是 short(二字節(jié)整數(shù)),或者 long long(八字節(jié)整數(shù))都會有類似問題,總結表格如下:

總結表格如下:

 

memset值 char short int long long
0 0 0 0 0
-1 -1 -1 -1 -1
5 5 1285 84215045 361700864190383365

  • 表格中,只有0 和 -1是正常的,因為 0 的二進制表示中,所有位都為0;-1 的二進制表示中,所有位都為 1;
  • 特別的,當需要設置的數(shù),對應類型的每個字節(jié)都是同一個數(shù)的時候,也可以采用 memset,比如:int 類型的 252645135(十六進制表示為:0x0f0f0f0f);

2、設置的值只有最低字節(jié)有效

memset(a, 0x05ffffff, sizeof(a));
memset(a, 0xffffff05, sizeof(a));
memset(a, 0xffffff08, sizeof(a));
memset(a, 0x12345678, sizeof(a));

設置值的時候,只會采用最低的字節(jié)作為賦值用,通俗的講,就是以上四句話調用,等價于:

memset(a, 0xff, sizeof(a));
memset(a, 0x05, sizeof(a));
memset(a, 0x08, sizeof(a));
memset(a, 0x78, sizeof(a));

3、堆內存不可直接 sizeof 取首地址

在堆上申請了一個數(shù)組空間,并且想要給它初始化,調用如下:

const int maxn = 1024;
int *p = new [maxn];
memset(p, 0, sizeof(p));
  • 這里進入了另一個誤區(qū),因為 p p p 在這里雖然是數(shù)組首地址,但是它扮演的角色更多的,其實是個指針,所以在進行 sizeof 運算符操作的時候,取得的值并不是 4096,而是指針的大小;
  • 32位機子上,指針大小為4,;64位機子上,指針大小為 8;
  • 正確做法是:
const int maxn = 1024;
int *p = new [maxn];
memset(p, 0, maxn * sizeof(int));

4、傳參數(shù)組不可直接 sizeof 取首地址

對傳參為數(shù)組的數(shù)據(jù)進行 memset,調用如下:

void fun(int a[maxn])
{    
    memset(a, 0, sizeof(a));
}
  • 這里調用同樣是錯誤的,因為當數(shù)組作為傳參的時候,這里的 a 已經退化為指針,所以同樣不能用 sizeof 數(shù)組首地址來取大??;
  • 正確做法是:
void fun(int a[maxn]) 
{    
    memset(a, 0, maxn * sizeof(int));
}

當然,當傳參是結構體指針的時候也是如此;

參考于:CSDN-英雄哪里出來https://blog.csdn.net/WhereIsHeroFrom/article/details/111660632

到此這篇關于C/C++ memset方法的誤區(qū)的文章就介紹到這了,更多相關C++ memset方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++控制臺版掃雷游戲

    C++控制臺版掃雷游戲

    這篇文章主要為大家詳細介紹了C++控制臺版掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 使用用C++做一顆會跳動的愛心實例代碼

    使用用C++做一顆會跳動的愛心實例代碼

    大家好,本篇文章主要講的是使用用C++做一顆會跳動的愛心實例代碼,感興趣的同學趕快來看一看吧,歡迎借鑒學習C++做一顆會跳動的愛心實例代碼
    2021-12-12
  • C++11中使用using的方法

    C++11中使用using的方法

    在 C++ 中 using 用于聲明命名空間,使用命名空間也可以防止命名沖突。這篇文章主要介紹了C++11中使用using的方法,需要的朋友可以參考下
    2021-09-09
  • c++ 封裝一個截圖服務

    c++ 封裝一個截圖服務

    這篇文章主要介紹了c++ 封裝一個截圖服務的方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-01-01
  • C++實現(xiàn)LeetCode(151.翻轉字符串中的單詞)

    C++實現(xiàn)LeetCode(151.翻轉字符串中的單詞)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(151.翻轉字符串中的單詞),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • ???????C語言實現(xiàn)單鏈表基本操作方法

    ???????C語言實現(xiàn)單鏈表基本操作方法

    這篇文章主要介紹了???????C語言實現(xiàn)單鏈表基本操作方法,文章圍繞主題展開詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • C++實現(xiàn)LeetCode(107.二叉樹層序遍歷之二)

    C++實現(xiàn)LeetCode(107.二叉樹層序遍歷之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(107.二叉樹層序遍歷之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 詳解c語言實現(xiàn)的內存池(適用于兩個線程、不加鎖、效率高)

    詳解c語言實現(xiàn)的內存池(適用于兩個線程、不加鎖、效率高)

    這篇文章主要介紹了c語言實現(xiàn)的內存池(適用于兩個線程、不加鎖、效率高),設計一個內存池,要求效率比系統(tǒng)調用的效率要高(測試1萬次),同時支持一個線程申請,另外一個線程釋放,需要的朋友可以參考下
    2024-02-02
  • __stdcall 和 __cdecl 的區(qū)別淺析

    __stdcall 和 __cdecl 的區(qū)別淺析

    __stdcall 和 __cdecl 的區(qū)別淺析,需要的朋友可以參考一下
    2013-03-03
  • C語言函數(shù)調用基礎應用詳解

    C語言函數(shù)調用基礎應用詳解

    函數(shù)就是一段封裝好的,可以重復使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復的代碼。這篇文章主要介紹了c語言是如何處理函數(shù)調用的?需要的朋友可以參考下
    2023-02-02

最新評論

云阳县| 常宁市| 西吉县| 嘉禾县| 繁峙县| 府谷县| 周宁县| 玉门市| 西青区| 兰西县| 霞浦县| 和静县| 葫芦岛市| 乌兰察布市| 新源县| 德格县| 霍林郭勒市| 吉木萨尔县| 石楼县| 西安市| 大邑县| 新野县| 乌海市| 丽水市| 日土县| 崇义县| 韩城市| 繁昌县| 四会市| 高安市| 长顺县| 海淀区| 海林市| 古丈县| 临湘市| 巴南区| 盐池县| 宝坻区| 哈巴河县| 和龙市| 鸡东县|