交换不连续的两个内存块.docx
《交换不连续的两个内存块.docx》由会员分享,可在线阅读,更多相关《交换不连续的两个内存块.docx(6页珍藏版)》请在第一文库网上搜索。
1、交换不连续的两个内存块Io假设有两段连续的内存块a和b;2首先对内存块a进行反转:a,=reverse(a);3o接着对内存块b进行反转:b,=reverse(b);3o最后对内存块ab进行反转:(aby=ba;是不是很神奇?当我第一次看到这个算法的时候,我就惊叹为什么这三步简单的操作就能解决看似很复杂的问题?如果你还不相信的话(我一开始和你一样也是不相信),请看下面的例子:Io假如有两段连续的内存块,a内存块的内容是匕bed”,b内存块的内容是“efgh”;2o首先对内存块a进行反转:a,=reverse(nabcd)=,dcba,;3o接着对内存块b进行反转:b,=reverse(,efg
2、h)=,hgfe;4o最后对内存块ab进行反转:(a,b,),=reverse(1,dcbahgfen)=efghabcd;那”reversa1a1gorithm”和本文中需要解决的问题有什么联系呢?在看到这个问题的时候,我就立即联想到了“reversa1a1gorithm,我试图通过已有的方法去解决类似的问题。幸运的是经过简单的分析和推论,我就找到了一个简单的方法,这个方法只要对“reversa1a1gorithm”进行简单的修改就可以解决本文的问题:1假设有三段连续的内存a,b和c,这样a和C是不连续的;2首先对内存块a进行反转:a,=reverse(a);3接着对内存块b进行反转:b=r
3、everse(b);4接着对内存块c进行反转:c,=reverse(c);5最后对内存块abc进行反转:reverse(abc)=cba;是不是超简单?这里使用了和reversa1a1gorithm”一样的思路。最后一次反转,不仅分别将内存块a和c中的数据调整为初始状态,而且还交换它们的位置。由于内存块b处于中间的位置,最后一次反转只将它的内容调整到初始状态。实现篇有了上面的分析,编写代码实现这个算法就显得相对比较简单了:Io首先我们需要一个反转内存块的函数。这个函数应该说比较简单:/*/IIIIIII/swaponeadjacentmemoryb1ock/Thememory1ayout1ik
4、ethis:/11/memTota1Size/RETURNVA1UE:Theaddressofthememoryjustbeingswappedvoid*swapMemory(void*pMemoryzsize_tmemTota1Size).if(NU11=pMemory)returnpMemory;if(memTota1Size2)returnpMemory;unsignedchar*pByteMemory=reinterpret_cast(pMemory);for(size_ti=O;imemTota1Size2;i+).unsignedchartempByte=*(pByteMemory
5、+i);*(pByteMemory+i)=*(pByteMemory+memTota1Size-1-i);*(pByteMemory+memTota1Size-1-i)=tempByte;returnpMemory;)就这个函数的实现,有以下几点需要说明:I0在函数的开始,我对函数的参数进行了一定的约束,这个在DesignByCOntraCt”中被称作前项约束Precondition”。相应的,在函数的最后还有一个后项约束PoStConditiorT;在函数中间的部分,应该还有一个被称为不变式(InVariant)的东西。这些约束的目的就是保证函数在开始/中间/结束过程中处于一个正确的状态。2
6、如果要对内存进行逐字节的访问,我们可以通过一个字符指针来完成。一个字符所占的内存空间是一个字节,它在内存块中的索引值就等于它相对于内存块首地址的偏移量。2有了上面的函数,按照本文前面的分析,我们就可以很容易实现本文的算法了:SW叩twononadjacentmemoryb1ock/Thememory1ayout1ikethis:/I111/memHeadSizememTota1Size-memHeadSize-memEndSizememEndSize/Thestart/endindexforthethreememoryb1ocksare:/Theheadb1ock:Oz(memHeadSize
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交换 连续 两个 内存
