記憶體反轉以及交換兩段連續 不連續 記憶體

2021-07-12 03:13:19 字數 2202 閱讀 2989

在《程式設計珠璣,第二版》和《程式設計之美》中都有關於交換兩段連續的記憶體塊的題目,而且非常經典,交換兩段連續記憶體塊的問題又可以延伸到交換兩段不連續記憶體塊的問題,無論是哪種情況都需要乙個基本操作:

反轉記憶體塊。

當遇到系統網路傳輸出現大小端不一致時,拼資料幀或者解資料幀的時候需要對不同的資料型別進行記憶體翻轉操作。反轉記憶體時,比較簡單,可以兩個指標同時走,也可以乙個指標,隨意,實現如下:

// reverse the memory block

// goal: |12345| -> |54321|

void * reversememory(void *pmemory, const size_t memsize)

return pmemory;

}

其中,函式的兩個形參分別為要反轉記憶體的起始位址和記憶體塊的大小。返回值型別為void*,指向反轉記憶體塊的起始位址。

實現了反轉記憶體塊這一基本操作後,我們就可以用它來交換兩段連續的記憶體,從而解決類似「陣列迴圈移位」的問題。具體演算法在程式設計珠璣和程式設計之美中都有詳細介紹,這裡簡單說一下:

假設有連續的記憶體塊m和n形如:|----m---|--------n---------|

首先反轉記憶體塊m:m』=reverse(m)

反轉記憶體塊n:n』=reverse(n)

對整個記憶體塊m』 n』進行反**(m』n』)』 = nm

舉例:m=」abc」, n=」1234」

m』=reverse(m)=」cba」

n』=reverse(n)=」4321」

(m』n』)』=(cba4321)』=」1234abc」

實現如下:

// swap two adjacent memory block

// goal: |*****|######| -> |######|*****|

void * swapadjacentmemory(void *pmemory, const size_t headsize, const size_ttotalsize)

函式的形參為記憶體起始位址pmemory、頭長度headsize和記憶體總長度totalsize,其中headsize就相當於「陣列迴圈移位問題」中移位大小,如右移4位等同於headsize為4。

現在我們明白了如何交換兩段連續的記憶體,那麼如何交換兩段不連續的記憶體呢?

形如:有記憶體man三塊:|----m---|----a----|-----n------|,我們要交換m,n,保持a不動。

類似於交換兩段連續記憶體,仔細地想一下並不難,演算法如下:

反轉記憶體塊m:m』=reverse(m)

反轉a:a』=reverse(a)

反轉n:n』=reverse(n)

反轉m』a』n』:(m』a』n』)』=nam

實現如下:

// swap two nonadjacent memory block

// goal: |*****|$$$$|######| -> |######|$$$$|*****|

void* swapnonadjacentmemory(void *pmemory, const size_t headsize, const size_tendsize, const size_t totalsize)

實現之後,我們寫乙個測試用例來驗證一下:

#include using namespace std;

#define maxbuffersize 100

void main()

; void * resultarr = malloc(maxbuffersize); // store the test result

if(null == resultarr) return ;

size_t arrlen = sizeof(stringarr)/sizeof(*stringarr);

// test swapadjacentmemory |

for(size_t i = 0; i < arrlen; ++i)

// test swapnonadjacentmemory

for(size_t i = 0; i < arrlen; ++i)

free(resultarr);

}

反轉記憶體 & 交換記憶體 這一操作很重要,後面的文章我們會看到其靈活運用的效果。

交換兩段連續 不連續 記憶體《轉》

在 程式設計珠璣,第二版 和 程式設計之美 中都有關於交換兩段連續的記憶體塊的題目,而且非常經典,交換兩段連續記憶體塊的問題又可以延伸到交換兩段不連續記憶體塊的問題,無論是哪種情況都需要乙個基本操作 反轉記憶體塊。反轉記憶體時,比較簡單,可以兩個指標同時走,也可以乙個指標,隨意,實現如下 01 re...

兩段鎖協議

我們都知道,事務排程一般有序列排程和並行排程,那首先來了解幾個概念。1 併發控制 所謂併發控制,是指多使用者共享的系統中,許多使用者可能同時對同一資料進行操作。2 排程 指的是事務的執行次序。3 序列排程 多個事務依次序列執行,且只有當乙個事務的所有操作都執行完後才執行另乙個事務的所有操作。只要是序...

兩段鎖協議

我們都知道,事務排程一般有序列排程和並行排程,那首先來了解幾個概念。併發控制 所謂併發控制,是指多使用者共享的系統中,許多使用者可能同時對同一資料進行操作。排程 指的是事務的執行次序。序列排程 多個事務依次序列執行,且只有當乙個事務的所有操作都執行完後才執行另乙個事務的所有操作。只要是序列排程,執行...