﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-chenglong7997-随笔分类-CTCI_C++</title><link>http://www.cppblog.com/chenglong7997/category/18939.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 04 Sep 2012 05:11:05 GMT</lastBuildDate><pubDate>Tue, 04 Sep 2012 05:11:05 GMT</pubDate><ttl>60</ttl><item><title>intern</title><link>http://www.cppblog.com/chenglong7997/archive/2012/09/02/189077.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sat, 01 Sep 2012 17:16:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/09/02/189077.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/189077.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/09/02/189077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/189077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/189077.html</trackback:ping><description><![CDATA[1.软件p4, vs, vim, cscope.&nbsp;<br />fix step：<br />先reproduce<br />再确定出现问题的函数，行号<br />分析原因<br />fix&nbsp;<br /><br /><br />vs中远程调试，指定ip，port， 同时在远程主机上要同意远程调试，接受指定user。要保证code与exe文件一致。<br />设定断点，观察debug输入，与预想的有什么不同。观察bt，thread stack 找到出现问题的函数或者行号。<br /><br />p4 中的check out, commit, diff, opened, edit， sync命令和作用。<br />submit step：merge changlist (from branch) (to branch)<br />check diff<br />resolve<br />make (so make sure the code is right)<br />submit (add comments)<br />set the bug state in Web<br /><br />vim:熟悉了各种命令。<br /><br />cscope，ctag：在linux中浏览代码很有用，可以找到function definition, struct definition, calling function, called function.&nbsp;<br /><br />在一个目录中建立cscope database， 可以再主目录建立，之后只在这里使用cscope，就能找到全部引用。<br /><br />linux， lib 文件的使用。 有.a 和.o的lib文件。<br /><br />2.code style.<br />文件命名要有层次感。例如，snape_webserver_msg.c, snape_webserver_thread.c, snape_webserver_log.c, snape_client_msg.c,,,<br />函数命名也要有层次感， 例如，snape_webserver_msg_set_connection(), snape_webserver_thread_create(),snape_client_request_get_pic().<br />变量命名也要有层次感和意义。<br />出错处理的专门函数。<br />debug level：debug，info, basic, webserver, client,,,<br /><br />3.函数的定义与浏览。<br />call graph definition.<br />函数名字最好能够显示出函数调用的graph。<br />使用hash table 保存大量类型的数据。<br />使用内容的md5作为这个内容的id，就可以完美配合hash table。<br /><br />4.thread， process<br />windows 中， object , event, cs<br />cs同步速度较快，但是使用cs容易进入deadlock状态。因为在等待进入cs时，无法设定超时值。<br />互斥对象与内核对象属于内核对象，利用内核对象进行线程同步，同步速度较慢，但这种方式可在多个进程的各个对象之间进行同步。<br />event分为人工重置与自动重置事件，两者在细节上，不同。<br /><br />5.cache implementation<br />client端可以使用类似os中，cache 与 虚拟内存的方法。b_modified表示是否经过更改，从而是否需要更新。每次只去拿新的东西。<br />而在server端，可以使用内容的MD5判断是否需要处理来到的内容，可以用多层次的MD5来更加去improve performance。例如用总体的md5，和各个部分的md5.<br />先判断总体MD5，如果改变，在去检查部分md5.如果没有改变，就整个都可以丢弃，不去处理。<br />design is very important. 代码的执行过程要完全依赖design。<br /><br />6.select function<br />异步select， 可以让线程不去busy waiting。<br />但是如果需要传输内容，需要trigger signal，让它不用等到timeout，就能发送数据。<br /><br />7.timestamp/timeout/ ts_diff<br />可以用ts_diff去同步时间。<br />使用timeout来防止任意操作的无限制等待<br />使用timestamp来决定哪一个更新。不要用counter。（无法同步，无法控制单一性）<br /><br />8.xml api<br />在传送数据方面，可以使用xml<br /><br />9.performace/memory usage<br />mm tools.<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/chenglong7997/aggbug/189077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-09-02 01:16 <a href="http://www.cppblog.com/chenglong7997/archive/2012/09/02/189077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++ 2D数组的动态分配方法比较</title><link>http://www.cppblog.com/chenglong7997/archive/2012/03/27/169078.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Mon, 26 Mar 2012 17:20:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/03/27/169078.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/169078.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/03/27/169078.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/169078.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/169078.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">方法1:</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 817px; word-break: break-all; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000ff; ">using</span>&nbsp;<span style="color: #0000ff; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">by&nbsp;snape&nbsp;2012-3-25<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">method&nbsp;1:&nbsp;drawback&nbsp;is&nbsp;we&nbsp;need&nbsp;calculate&nbsp;the&nbsp;one-dimensional&nbsp;index&nbsp;to&nbsp;<a title="Powered by Text-Enhance" id="_GPLITA_0" href="http://www.cppblog.com/chenglong7997/articles/168958.html#" in_rurl="http://www.textsrv.com/click?v=VVM6MTQ1NjI6MjQ6YWNjZXNzOjkwYjM2ZjUxM2ZlZDdmZWEzYmJjYjA4NGZmZTU5MzI0OnotMTA0Ny0xNDIxMjp3d3cuY3BwYmxvZy5jb20%3D" style="color: #0066aa; ">access</a>&nbsp;the&nbsp;2D&nbsp;array</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;rowSize,&nbsp;colSize,&nbsp;totalSize;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;index,&nbsp;i,j;<br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"Enter&nbsp;the&nbsp;row&nbsp;and&nbsp;column&nbsp;size&nbsp;for&nbsp;your&nbsp;2D&nbsp;array!"&lt;&lt;endl;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&gt;&gt;rowSize&gt;&gt;colSize;<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalSize=rowSize*colSize;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;*pArray;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pArray=<span style="color: #0000ff; ">new</span>&nbsp;<span style="color: #0000ff; ">int</span>[totalSize];<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">file&nbsp;&nbsp;the&nbsp;array&nbsp;with&nbsp;integers&nbsp;from&nbsp;0&nbsp;to&nbsp;totalsize<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">file&nbsp;across&nbsp;the&nbsp;rows,&nbsp;moving&nbsp;down&nbsp;the&nbsp;colums</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;arrayValue=0;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(i=0;&nbsp;i&lt;rowSize;&nbsp;++i)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">outer-loop&nbsp;traverse&nbsp;down&nbsp;the&nbsp;"rows"</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(j=0;&nbsp;j&lt;colSize;&nbsp;++j)<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">caculate&nbsp;array&nbsp;index<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">index=rowSize*j+i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">both&nbsp;index=rowSize*j+i;&nbsp;and&nbsp;index=colSize*i+j;&nbsp;are&nbsp;ok</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index=colSize*i+j;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">but&nbsp;if&nbsp;index=rowsize*i+j;&nbsp;or&nbsp;index=colSize*j+i;&nbsp;then&nbsp;there&nbsp;will&nbsp;be&nbsp;a&nbsp;bug.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pArray[index]=arrayValue;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;i&nbsp;like&nbsp;index=colSize*i+j;&nbsp;since&nbsp;the&nbsp;arrange&nbsp;of&nbsp;2D&nbsp;is&nbsp;according&nbsp;to&nbsp;rows</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"index="&lt;&lt;index&lt;&lt;endl;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"i(row)="&lt;&lt;i&lt;&lt;"j(col)="&lt;&lt;j&lt;&lt;"array&nbsp;value"&lt;&lt;pArray[index]&lt;&lt;endl;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++arrayValue;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">output&nbsp;the&nbsp;array</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;k=0;&nbsp;k&lt;totalSize;&nbsp;++k)<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;pArray[k]&lt;&lt;endl;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"The&nbsp;End"&lt;&lt;endl;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;pArray;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">44</span>&nbsp;}<br /><span style="color: #008080; ">45</span>&nbsp;<br /><span style="color: #008080; ">46</span>&nbsp;</div><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">方法2：</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 817px; word-break: break-all; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">by&nbsp;snape<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">method&nbsp;2:&nbsp;better&nbsp;than&nbsp;method&nbsp;1,&nbsp;but&nbsp;call&nbsp;new&nbsp;twice</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;rowSize,&nbsp;colSize,&nbsp;totalSize;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;i,&nbsp;j;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"Enter&nbsp;the&nbsp;row&nbsp;and&nbsp;column&nbsp;size&nbsp;for&nbsp;your&nbsp;2D&nbsp;array"&lt;&lt;endl;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&gt;&gt;rowSize&gt;&gt;colSize;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalSize=rowSize*colSize;<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;*pArray;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">pointer&nbsp;to&nbsp;an&nbsp;integer</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;**pPointerArray;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">pointer&nbsp;to&nbsp;an&nbsp;integer&nbsp;pointer</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pArray=<span style="color: #0000ff; ">new</span>&nbsp;<span style="color: #0000ff; ">int</span>[totalSize];&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">memory&nbsp;for&nbsp;totalSize&nbsp;integers</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPointerArray=<span style="color: #0000ff; ">new</span>&nbsp;<span style="color: #0000ff; ">int</span>*[rowSize];&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">memory&nbsp;for&nbsp;rowSize&nbsp;#&nbsp;of&nbsp;int&nbsp;pointers<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">fill&nbsp;the&nbsp;pointer&nbsp;array&nbsp;with&nbsp;the&nbsp;pArray[i][0]&nbsp;address</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(i=0;&nbsp;i&lt;rowSize;&nbsp;++i)<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPointerArray[i]=pArray+i*colSize;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">place&nbsp;the&nbsp;address&nbsp;into&nbsp;the&nbsp;pointer<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">now&nbsp;fill&nbsp;the&nbsp;pArray&nbsp;by&nbsp;using&nbsp;the&nbsp;pPointerArray&nbsp;to&nbsp;access&nbsp;elements</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;arrayValue=0;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(i=0;&nbsp;i&lt;rowSize;&nbsp;++i)<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(j=0;&nbsp;j&lt;colSize;&nbsp;++j)<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPointerArray[i][j]=arrayValue;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cool</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"i(row)="&lt;&lt;i&lt;&lt;"j(col)="&lt;&lt;j&lt;&lt;"array&nbsp;value="&lt;&lt;pPointerArray[i][j]&lt;&lt;endl;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++arrayValue;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">output&nbsp;the&nbsp;array</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;k=0;&nbsp;k&lt;totalSize;&nbsp;++k)<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;pArray[k]&lt;&lt;endl;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"The&nbsp;End!"&lt;&lt;endl;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;pArray;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;pPointerArray;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">43</span>&nbsp;}</div><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">方法3：</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 817px; word-break: break-all; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;by&nbsp;snape<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">method&nbsp;3:&nbsp;better&nbsp;than&nbsp;method&nbsp;2.&nbsp;just&nbsp;malloc&nbsp;once&nbsp;and&nbsp;the&nbsp;memory&nbsp;is&nbsp;contiguous&nbsp;block.&nbsp;the&nbsp;<a title="Powered by Text-Enhance" id="_GPLITA_1" href="http://www.cppblog.com/chenglong7997/articles/168958.html#" in_rurl="http://www.textsrv.com/click?v=VVM6MTMyMzc6NDpiZXN0OjdmODY5YmEwYmFjZGJhM2U0ODQ4NWQyNzQ4YzFhM2I3OnotMTA0Ny0xNDIxMjp3d3cuY3BwYmxvZy5jb20%3D" style="color: #0066aa; ">best</a></span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;**my2DAlloc(<span style="color: #0000ff; ">int</span>&nbsp;rowSize,&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;colSize)<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;i;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;header=rowSize&nbsp;*&nbsp;<span style="color: #0000ff; ">sizeof</span>(<span style="color: #0000ff; ">int</span>&nbsp;*);<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;data=rowSize&nbsp;*&nbsp;colSize&nbsp;*&nbsp;<span style="color: #0000ff; ">sizeof</span>(<span style="color: #0000ff; ">int</span>);<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;**rowptr=(<span style="color: #0000ff; ">int</span>&nbsp;**)malloc(header+data);&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">malloc&nbsp;memory&nbsp;for&nbsp;both&nbsp;data&nbsp;and&nbsp;pointerArray(the&nbsp;header)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>(rowptr==NULL)<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;NULL;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;*buf=(<span style="color: #0000ff; ">int</span>&nbsp;*)(rowptr+rowSize);&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">buf:&nbsp;the&nbsp;pointer&nbsp;to&nbsp;the&nbsp;first&nbsp;data</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(i=0;&nbsp;i&lt;rowSize;&nbsp;++i)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">assign&nbsp;the&nbsp;address&nbsp;of&nbsp;each&nbsp;row&nbsp;to&nbsp;pointerArray(the&nbsp;header)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowptr[i]=buf+i*colSize;<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;rowptr;<br /><span style="color: #008080; ">17</span>&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">20</span>&nbsp;{<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"Enter&nbsp;the&nbsp;row&nbsp;and&nbsp;column&nbsp;size&nbsp;for&nbsp;your&nbsp;2D&nbsp;array"&lt;&lt;endl;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;rowSize,&nbsp;colSize;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&gt;&gt;rowSize&gt;&gt;colSize;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;**p=my2DAlloc(rowSize,&nbsp;colSize);<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">assign&nbsp;values</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;i,&nbsp;j,&nbsp;arrayValue=0;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(i=0;&nbsp;i&lt;rowSize;&nbsp;++i)<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(j=0;&nbsp;j&lt;colSize;&nbsp;++j)<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i][j]=arrayValue++;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">output&nbsp;values</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(i=0;&nbsp;i&lt;rowSize;&nbsp;++i)<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(j=0;&nbsp;j&lt;colSize;&nbsp;++j)<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;p[i][j]&lt;&lt;endl;<br /><span style="color: #008080; ">36</span>&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a title="Powered by Text-Enhance" id="_GPLITA_2" href="http://www.cppblog.com/chenglong7997/articles/168958.html#" in_rurl="http://www.textsrv.com/click?v=VVM6MTMyMzc6NDpmcmVlOmQ3OGMyMTVlZjdmODliMzY1YjExZmUwNjg4YTM3NTA5OnotMTA0Ny0xNDIxMjp3d3cuY3BwYmxvZy5jb20%3D" style="color: #0066aa; ">free</a>((<span style="color: #0000ff; ">void</span>&nbsp;*)p);<br /><span style="color: #008080; ">38</span>&nbsp;}</div><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">方法3，我感觉最好，只调用一次malloc， 空间连续，释放内存也比较方便。</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">大家有什么想法的欢迎交流</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><img src ="http://www.cppblog.com/chenglong7997/aggbug/169078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-03-27 01:20 <a href="http://www.cppblog.com/chenglong7997/archive/2012/03/27/169078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C 边界对齐的malloc和free函数实现</title><link>http://www.cppblog.com/chenglong7997/archive/2012/03/27/169077.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Mon, 26 Mar 2012 17:19:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/03/27/169077.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/169077.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/03/27/169077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/169077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/169077.html</trackback:ping><description><![CDATA[<h2><span style="background-color: #ffffff; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">MSVC 下面有：</span></h2><div style="font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #ffffff; "><div style="background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 817px; word-break: break-all; "><span style="color: #008080; ">1</span>&nbsp;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;*&nbsp;_aligned_malloc(<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;size,&nbsp;<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;alignment<br /><span style="color: #008080; ">5</span>&nbsp;);</div>Unix/Linux下面有：<br /><div style="background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 817px; word-break: break-all; "><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;posix_memalign(<span style="color: #0000ff; ">void</span>&nbsp;**memptr,&nbsp;size_t&nbsp;alignment,&nbsp;size_t&nbsp;size);</div><br />自己实现：<br /><div style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 817px; word-break: break-all; background-color: #eeeeee; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;&lt;stdlib.h&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000ff; ">using</span>&nbsp;<span style="color: #0000ff; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">by&nbsp;snape&nbsp;2012-3-25</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;*aligned_malloc(size_t&nbsp;required_bytes,&nbsp;size_t&nbsp;alignment)<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;*p1;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">orignal&nbsp;block</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;**p2;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">aligned&nbsp;block</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;offset=alignment-1+<span style="color: #0000ff; ">sizeof</span>(<span style="color: #0000ff; ">void</span>*);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>(&nbsp;(p1=(<span style="color: #0000ff; ">void</span>*)malloc(required_bytes+offset))==NULL&nbsp;)<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;NULL;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cast&nbsp;void*&nbsp;to&nbsp;void**&nbsp;to&nbsp;let&nbsp;p1&nbsp;store&nbsp;into&nbsp;heap&nbsp;in&nbsp;the&nbsp;<a title="Powered by Text-Enhance" id="_GPLITA_0" href="http://www.cppblog.com/chenglong7997/articles/168957.html#" in_rurl="http://www.textsrv.com/click?v=VVM6MTY2MzI6MTIxOmZvcm06ZDVjNGVlZGIxZTZmYjFiZTQ0Njk2NmU5M2Y3YzIwNjE6ei0xMDQ3LTE0MjEyOnd3dy5jcHBibG9nLmNvbQ%3D%3D" in_hdr="null" style="color: #0066aa; ">form</a>&nbsp;of&nbsp;pointer</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2=(<span style="color: #0000ff; ">void</span>**)(&nbsp;((size_t)(p1)+offset)&nbsp;&amp;&nbsp;~(alignment-1)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">add&nbsp;offset&nbsp;to&nbsp;p1&nbsp;and&nbsp;then&nbsp;back&nbsp;to&nbsp;the&nbsp;aligned&nbsp;address</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2[-1]=p1;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;p2;<br /><span style="color: #008080; ">19</span>&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;aigned_free(<span style="color: #0000ff; ">void</span>&nbsp;*p2)<br /><span style="color: #008080; ">22</span>&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">void</span>*&nbsp;p1=((<span style="color: #0000ff; ">void</span>**)p2)[-1];&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">get&nbsp;the&nbsp;p1</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a title="Powered by Text-Enhance" id="_GPLITA_1" href="http://www.cppblog.com/chenglong7997/articles/168957.html#" in_rurl="http://www.textsrv.com/click?v=VVM6MTMyMzc6NDpmcmVlOmQ3OGMyMTVlZjdmODliMzY1YjExZmUwNjg4YTM3NTA5OnotMTA0Ny0xNDIxMjp3d3cuY3BwYmxvZy5jb20%3D" style="color: #0066aa; ">free</a>(p1);<br /><span style="color: #008080; ">25</span>&nbsp;}<br /><span style="color: #008080; ">26</span>&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">30</span>&nbsp;{<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;size=10,&nbsp;align=16;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;*p=(<span style="color: #0000ff; ">int</span>&nbsp;*)aligned_malloc(size,&nbsp;align);<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"The&nbsp;<a title="Powered by Text-Enhance" id="_GPLITA_2" href="http://www.cppblog.com/chenglong7997/articles/168957.html#" in_rurl="http://www.textsrv.com/click?v=VVM6MTMxNTk6NDpzdGFydDoxMTMzNzlkOTQxZGFlY2M5MjZlYjZhYjE4YzM4MzI3ZDp6LTEwNDctMTQyMTI6d3d3LmNwcGJsb2cuY29t" style="color: #0066aa; ">start</a>&nbsp;address="&lt;&lt;p&lt;&lt;endl;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aigned_free(p);<br /><span style="color: #008080; ">37</span>&nbsp;}</div><br />上面实现很考验对指针的掌握。原理不是很难。<br /><br />Line12：分配内存的时候，加上alignment-1个空间，就能保证能够找到和alignment对齐的开始地址。多出来的sizeof（void*）是为了保存malloc最初返回的指针p1而分配的一个空间<br /><br />Line 17: 保存原始的malloc返回的地址p1到对齐地址的前一个空间</div><img src ="http://www.cppblog.com/chenglong7997/aggbug/169077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-03-27 01:19 <a href="http://www.cppblog.com/chenglong7997/archive/2012/03/27/169077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>