memmove,memcopy區別和實現

2021-07-07 05:18:59 字數 902 閱讀 5077

memcpy是把source   指向的物件中的n個字元拷貝到destin所指向的物件中,返回指向結果物件的指標。   

memmove也是把source   指向的物件中的n個字元拷貝到destin所指向的物件中,但過程就好象是先把source所指向的 物件拷貝到臨時陣列中,然後在從臨時陣列拷貝到destin所指的物件中,返回指向結果物件的指標。   

但要注意,除memmove之外的字串操作函式在拷貝同乙個字串中的字元時,其結果是不確定的。也就是說,memmove 可以把自己的一部分拷貝給自己的另一部分。其他函式不行,比如memcpy(事實上也是可行的,msdn裡的例子就沒問題,暫且不管 他了)。

先看memcpy的,沒什麼很特別的,咱們都會:

但據說執行庫裡memcpy是用彙編寫的,執行快,看到的.c**檔案都是象徵性**!

再看看memmove是怎麼實現的,如果讓我們實現memmove功能,我想很多人會像我最初的想法一樣,先做乙個拷 貝吧?我們看看linux核心裡是怎麼實現的:

紫色的** 

: 如果源位址與目標位址的拷貝不存在覆蓋問題,則直接用memcpy,在核心層面上盡可能重用**是應該必須的!但這很同樣 值得我們去反思我們平時的**,到處充斥著功能相同或近似的**,那天突然發現了bug,就得從頭到尾去找那些用相同思想寫出來的拷 貝,這是一種折磨,我保證!因為我經歷過,並且很多時候由於沒有事先構建好程式架構而當編了上千行**後又懶得抽取那些功 能相似的**作為函式,總想著沒多少了,就這樣吧...這樣寫出來的**大家可想而知,debug和維護起來將是災難,我 只能祈禱那些東西不要出什麼亂子,最好也不用再更新吧,各位借鑑!

紅色的** 

: 為我們最開始的先做個拷貝的想法哀悼了嗎?我是自慚了!

這是多麼漂亮而巧妙的**

,前序遍歷會出現重疊問題轉而用後序遍歷很巧妙的省去了乙個拷貝,學習學習

堆區 棧區 靜態區 常量區還有???

常見的儲存區域可分為 由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,程式會一直占用記憶體,導致記憶體洩漏...

c 棧區 堆區 常量區

c 中棧區 堆區 常量區 由一道面試題目而學習 2009 04 28 21 01 include void main 對應的彙編 10 a c 1 00401067 8a 4d f1 mov cl,byte ptr ebp 0fh 0040106a 88 4d fc mov byte ptr ebp...

記憶體的使用 棧區 堆區 靜態區 唯讀區

記憶體的使用感覺好亂啊,需要整理一下!於是參考c primer與網上資源,整理如下 一 綜述 記憶體中的棧區分配的是區域性變數和函式的引數值的空間,棧的生長方向是從高往低的 堆區是向上增長的用於分配程式設計師申請的記憶體空間 比如new 申請的動態記憶體 注意它與資料結構中的堆是兩回事,分配方式倒是...