程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於內存比較和字節對齊

關於內存比較和字節對齊

編輯:關於C語言

作者blog:87year.info

昨天在淘寶核心團隊成員http://donghao.org/2011/02/uaeei.html看到一篇內存比較的文章,並不是說文章有錯誤,只是在我現在工作的平台下有些小問題.

原文很小,直接粘貼過來
————-以下是引用————————————

判斷上百萬個4k的buffer是否為全0,我最先想到的辦法是:

zero_buffer = malloc(4096);
memset(zero_buffer, 0, 4096);
/* 循環百萬次讀取buffer */
if (!memcmp(zero_buffer, buffer)) {
/* 全0 */
}
做完以後跑了一下,速度湊合。由於好奇,看看shell工具cp的代碼,它的解決辦法是:
/* 循環百萬次讀取buffer */
long *wp = buffer;
while (*wp++ ==0 && wp<buffer + 4096)
continue;
if (wp >= buffer + 4096) {
/* 全0 */
}
cp的代碼真稱得上千錘百煉,這比我的方法要快,因為我的辦法需要CPU訪問兩塊內存(buffer和zero_buffer),而cp只問一塊內存,CPU的cache會高效得多。
判斷一塊4k buffer當然看不出快慢,我們循環上百萬次,立刻就能看出差別:cp的算法比我的快了3倍。
—————引用結束—————————————–

第一份代碼,直接使用memcmp比較.原文的評論中說有點繞,但是不出問題.

第二份說是來自linux shell的cp源碼.我認為在某些平台有潛在錯誤.

它”假設”buffer是4字節對齊,萬一平台中不是4字節對齊.那麼程序就直接掛了.

在windows mobile平台下做的實驗代碼.

————-代碼開始————————————
long zero_buf[24]={0};
memset(zero_buf,0×0,sizeof(long)*24);//初始化
long *wp = (long*)((byte*)zero_buf+3);//故意不對齊
while (*wp++ ==0 && wp<zero_buf + 4096)  continue;//*wp會報內存不對齊的錯誤
if (wp >= zero_buf + 4096){
/* 全0 */
}
————代碼結束————————————–

update:

突然想起之前看過的一份strcpy源碼.也是利用long類型來加速拷貝,在拷貝之前判斷是否對齊.如果結合strcpy來做上面這個命題的話,應該更穩定.

推薦閱讀:

1.html" target=_blank>stcpy分析

2.strlen分析

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved