RDI 開發中使用memcpy的用法小結

2021-06-27 10:34:20 字數 2129 閱讀 2493

最近在研究陣列(array_i)之間copy的執行效率問題,目標是實現vector裡的所有array copy到乙個新的array裡。

原始方法:

vectorvecarray; int isize=0;

for(unsigned int i=0;i

這種方法效率較低,當vector裡的元素為10000個時,執行時間約為0.4-0.5 ms. 在一次只有5ms的程式中,是無法接受的事情,因此必須要找到效率更高的copy方法。

後嘗試了memcpy,將一次copy的時間縮短到1 us.

1、memcpy 函式用於 把資源記憶體(src所指向的記憶體區域) 拷貝到目標記憶體(dest所指向的記憶體區域.    拷貝的個數由size變數控制

拷貝的位元組數;

函式原型:

void *memcpy(void *dest, void *src, unsigned int count);
用法:(1)可以拷貝任何型別的物件,因為函式的引數型別是void*(未定義型別指標),也就是說傳進去的實參可以是int*,short*,char*等等,但是由於函式拷貝的過程是乙個位元組乙個位元組的拷貝的,所以實際操作的時候要把void*強制轉化為char*,這樣在指標加的時候才會保證每次加乙個位元組,

所以實際用法為:

void memcpy( (char *)&a[pos_a], (char *)&b[pos_b], isize*sizeof(int) );

a 為目標array_i,b為被拷貝的array_i,isize為需要拷貝到a中的個數,pos_a,pos_b,為array_i的起始位置。

後查閱memcpy源**,源**如下:

void *memcpy1(void *desc,const void * src,size_t size)

unsigned char *desc1 = (unsigned char*)desc;

unsigned char *src1 = (unsigned char*)src;

while(size-- >0)

return desc;

}int _tmain(int argc, _tchar* argv)

; const char src[5] = "1234";

//printf(src);

memcpy1(dest,src,sizeof(src));

//*(dest+5) = '/0';

printf((char *)dest);

int m = -1;

return 0;

}

注意事項:

1,void* 一定要返回乙個值(指標),這個和void不太一樣!

2,首先要判斷指標的值不能為空,desc為空的話肯定不能拷貝記憶體空間,src為空相當於沒有拷貝;所以之間return掉;

,3,""空串是指內容為0,null是0,不是串;兩個不等價;

4,int dest[2] = ;這是對int 型別的陣列初始化的方法;如果是char型別,就用char a[5] = "1234";  注意陣列下標要多於實際看到的字元數,因為還有'/0'

5,memcpy1(dest,src,sizeof(src));注意裡面的sizeof(src),這個是包括字串的結束符'/0'的;所以不用擔心printf(dest);

但是如果用memcpy1(dest,src,4);沒有'/0'就要*(dest+5) = '/0';這樣保證是乙個完整的字串;

,6,如果初始化的時候:

char dest[1024] = "12345666";//;

const char src[5] = "3333";

那麼拷貝的時候,如果用memcpy1(dest,src,sizeof(src));則printf(dest);出來是3333

如果memcpy1(dest,src,4);則printf(dest);出來是33335666;因為上面的sizeof(src),包含'/0',所以拷貝過去的字串以'/0'

結束,就只有3333,而如果傳4個字元,'/0'是第五個字元,那就遇到dest[1024] 的'/0'結束,所以是33335666

總結,memcpy確實是不錯的方法,編**的不能硬來。。第一篇文章,就這樣吧

關於Android開發中使用的XML

1.布局 framelayout 以堆疊方式顯示乙個或多個子檢視。gridlayout 將子檢視按行和列排列。linearlayout 將所有子檢視排列成一行或一列。relativelayout 一種靈活的布局,以相對於其他檢視的方式排列檢視。2.常見的介面元素 button 按鈕控制項 check...

Android開發中使用的Utils 持續更新

public class fileutils 判斷目錄是否存在,不存在則判斷是否建立成功 param dirpath 目錄路徑 return 存在或建立成功 不存在或建立失敗 public static boolean createorexistsdir string dirpath else 判斷...

關於iOS開發中使用的證書

在建立開發證書和發布證書之前都要到鑰匙訪問串中申請乙個檔案 certificatesigningrequest.certsigningrequest 網上很多人說這個檔案也使用一次,事實上不一定的。公鑰只包含了一半,另一半在申請的.cer的證書中。使用csr檔案製作的證書有兩種 developer和...