1. 程式人生 > >memset()的效率以及原始碼分析

memset()的效率以及原始碼分析

void *memset(void *s, int ch, size_t n);
作用:將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ASCII值, 塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。
不知道有沒有像我一樣把memset當作萬能的初始化工具,例如:
int arr[n];
memset(arr,1,n*sizeof(int));
這樣得到的arr陣列一定不是全0,而是16843009,下面解釋原因。
首先,變數型別的本質只是標誌從某一記憶體地址開始讀取的位數,強制轉換就是改變讀取位數的大小。

下面來看memset的實現:(程式碼來自《C標準庫》P398)

void *(memset) (void *s,int c,size_t n)
{
	const unsigned char uc = c;
	unsigned char *su;
	for(su = s;0 < n;++su,--n)
		*su = uc;
	return s;
}
第3行把int型別的c轉換成unsigned char型別,意味著截去c的高24位,只保留低8位。第4行把s當作unsigned char*型別,也就是說su中的每一個元素按8位計算。
現在來看看文章開頭的那個程式碼會做什麼。
c的二進位制 : 00000000000000000000000000000001(32位)
1、c轉換為unsigned char 後:00000001(8位)
2、將指標su(unsigned char型別)的每一元素(8位)賦值為00000001,迴圈4n次。
3、memset()結束後,arr的每個元素按照int型別讀取,讀出來的就是1000000010000000100000001,十進位制就是16843009。

不過如果是memset(arr,0,n*sizeof(int));的話可以使用,因為32位都是0

再來說memset()的效率問題。使用memset函式與將上面的函式程式碼寫在自己的程式裡是不一樣的,C標準庫中的memset對Cache的利用做了優化,具體的在《C專家程式設計》151頁有解釋(其實是我沒看懂),這裡給出測試:
#include <string.h>
#define MAXSIZE 100000

int main()
{
    char arr[MAXSIZE];
    for(int i=0;i<10000;i++)
    {
        memset(arr,'0',sizeof(arr));
//        for(int j=0;j<MAXSIZE;j++)
//            arr[0] = '0';
    }
    return 0;
}
程式裡的註釋部分與memset行分別使用,結果是使用memset的程式執行時間大約為0.1s,而用for迴圈的程式要3s多。
綜上:memset()可以用在字元陣列的初始化以及類似於memset(arr,0,n*sizeof(int));的情況,效率比手動賦值要高的多。




相關推薦

memset效率以及原始碼分析

第3行把int型別的c轉換成unsigned char型別,意味著截去c的高24位,只保留低8位。第4行把s當作unsigned char*型別,也就是說su中的每一個元素按8位計算。現在來看看文章開頭的那個程式碼會做什麼。c的二進位制 : 00000000000000000000000000000001(3

memset()的效率以及原始碼分析

void *memset(void *s, int ch, size_t n); 作用:將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ASCII值, 塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。 不知道有沒有像我一樣把memset當

HashMap的學習以及原始碼分析

Hashmap HashMap繼承AbstractMap類,實現了Map介面(由下圖可見),在java集合中,它是一個基本的儲存資料的結構。他的底層是由 陣列+連結串列 構成,通過特定的雜湊函式從 鍵(key)來定位值。 HashMap的結構形式大概如圖所示: 構造雜湊函式

Tomcat(二) Tomcat實現: Servlet與web.xml介紹 以及 原始碼分析Tomcat實現細節

轉載自;http://blog.csdn.net/tjiyu/article/details/54590259     -------如有侵權  請聯絡我 我會進行刪除    在《Tomcat(一

Spring原始碼分析(十五)Spring中常用註解使用以及原始碼分析

從Java5.0開始,Java開始支援註解。Spring做為Java生態中的領軍框架,從2.5版本後也開始支援註解。相比起之前使用xml來配置Spring框架,使用註解提供了更多的控制Spring框架的方式。 現在越來越多的專案也都在使用註解做相關的配置,但Spring的註解非常多,相信

MyBatis 本地快取和二級快取使用以及原始碼分析 第一篇

本地快取    也稱為一級快取,分為兩個作用域SESSION和STATEMENT。官網中的描述:MyBatis利用本地快取機制(Local Cache)防止迴圈引用(迴圈引用)和加速重複巢狀查詢。預設值為SESSION,這種情況下會快取一個會話中執行的所有查詢。若設定值為ST

MyBatis 本地快取和二級快取使用以及原始碼分析 第二篇

                                         本篇分析

springmvc工作原理以及原始碼分析(基於spring3.1.0)

springmvc是一個基於spring的web框架.本篇文章對它的工作原理以及原始碼進行深入分析. 一、springmvc請求處理流程   引用spring in action上的一張圖來說明了springmvc的核心元件和請求處理流程:       

開源專案Jchat 編譯以及原始碼分析

Android jChat 是一個 Android 手機上基於位置的聊天軟體,採用P2P通訊機制。 本下載包含有:開發文件以及AndroidjChat原始碼和JADE應用的一個聊天測試程式(JadeAndroid-Programming-Tutorial 有說明)。 JCh

Spring Cloud 2.0 實戰——Eureka(四.Eureka架構整理以及原始碼分析 —— 自我理解)

簡述Eureka服務治理體系 在分析原始碼之前,我們再來簡單的梳理一下Eureka服務治理體系。在整個服務治理基礎架構中有三個核心要素: 服務註冊中心:Eureka提供的服務端,提供服務註冊與發現的功能,也就是在之前我們是實現的eurekaserver。

物件池commons-pool框架的研究以及原始碼分析(一)

    物件池是一個物件集合,用於將建立好的物件存在該集合中,當需要使用池中的物件時,再從池中取出,恰當地使用物件池可以有效減少物件生成和初始化時的消耗,提高系統的執行效率。另外,利用物件池還可以對物件的狀態做一定的維護,確保物件是可用的,提高程式的健壯性。注意:物件池技術

HshMap 資料結構以及原始碼分析

最近整理資料結構方面的知識點,HashMap是很重要的一部分,今天來聯合原始碼分析他的資料結構以及儲存方式! 接下來將從以下幾個方面來分析(根據JDK1.8) 1. 構造方法 2. 重要的幾個資料解釋 3. put 4. get HashMap

SpringMVC @SessionAttributes 使用詳解以及原始碼分析

public class SessionAttributesHandler { private final Set<String> attributeNames = new HashSet<String>(); private final Set<Clas

深度理解Android InstantRun原理以及原始碼分析

Instant Run官方介紹 簡單介紹一下Instant Run,它是Android Studio2.0以後新增的一個執行機制,能夠顯著減少你第二次及以後的構建和部署時間。簡單通俗的解釋就是,當你在Android Studio中改了你的程式碼,Instant Ru

Apache 開源的curator 基於Zookeeper實現分散式鎖以及原始碼分析

前一段時間,我發表了一篇關於Redis實現分散式鎖 分散式環境下利用Redis實現分散式鎖,今天我帶領大家熟悉用zookeeper實現分散式鎖。 在學習分散式鎖之前,讓我們想一想,在什麼業務場景下會用到分散式鎖以及設計分散式鎖要注意什麼? 分散式鎖介紹 1、在什麼業務場

基於樹莓派raspberry: 移植 2.4寸TFT顯示屏以及原始碼分析

有了樹莓派,但是沒有hdmi顯示器,這是個蛋疼的事,但是樹莓派就是樹莓派,他的GPIO管腳就是我們發揮想象力的地方.可以通過它的GPIO管腳來驅動一個顯示屏.GOOGLE了一下,這個專案有個老外做好了,而且提供了patch檔案,很容易就能移植到核心裡面去.這裡我就在這裡

xgboost 實戰以及原始碼分析

1.序   距離上一次編輯將近10個月,幸得愛可可老師(微博)推薦,訪問量陡增。最近畢業論文與xgboost相關,於是重新寫一下這篇文章。   關於xgboost的原理網路上的資源很少,大多數還停留在應用層面,本文通過學習陳天奇博士的PPT、論文、一些網路資源,希望對

Handler使用場景以及原始碼分析

路漫漫其修遠兮,吾將上下而求索 Handler的使用場景 子執行緒操作完成之後,通知主執行緒執行操作 首先在主執行緒建立一個Handler例項 private val MSG_WHAT: Int = 1000 private var

PullToRefreshScrollView踩坑經歷以及原始碼分析

         目前下拉重新整理已經滿大街都是,在自己的應用如果不使用這個模式的話,出門都不好意思和人家打招呼,該文章結合自己使用PullToRefreshScrollView過程中所遇到的問題,簡單探討下針對於github 上的這個開源專案的使用心得,具體的使用方法不

Tomcat(二) Tomcat實現:Servlet與web.xml介紹 以及 原始碼分析Tomcat實現細節

<web-app> <display-name></display-name> <!--WEB應用的名字 --> <description></description> <!--WEB應用的描述--&