📄 谈谈对齐(上) - fmddlmyy的专栏 - csdnblog.htm
字号:
<DD><A href="http://hi.baidu.com/fmddlmyy" target=_self>我的百度空间</A>
<DT>存档
<DD>
<DIV class=publiclist_sidebar>
<UL>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2009/02.aspx">2009年02月(3)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2009/01.aspx">2009年01月(6)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/12.aspx">2008年12月(7)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/11.aspx">2008年11月(7)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/10.aspx">2008年10月(2)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/09.aspx">2008年09月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/07.aspx">2008年07月(6)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/06.aspx">2008年06月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/05.aspx">2008年05月(4)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/04.aspx">2008年04月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/03.aspx">2008年03月(2)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/02.aspx">2008年02月(2)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2007/11.aspx">2007年11月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2007/06.aspx">2007年06月(3)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2007/04.aspx">2007年04月(2)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2007/03.aspx">2007年03月(2)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2007/02.aspx">2007年02月(3)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2006/07.aspx">2006年07月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2005/09.aspx">2005年09月(5)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2005/08.aspx">2005年08月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2005/06.aspx">2005年06月(1)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2005/05.aspx">2005年05月(2)</A>
<LI><A
href="http://blog.csdn.net/fmddlmyy/archive/2005/04.aspx">2005年04月(3)</A></LI></UL></DIV><SPAN
id=RecentVisitors></SPAN><SPAN id=SubscriptionList>
<DT>订阅我的博客
<DD><A href="http://blog.csdn.net/fmddlmyy/Rss.aspx"><IMG alt=XML聚合
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/xml.gif"
border=0></A> <A href="http://feeds.feedsky.com/csdn.net/fmddlmyy"
target=_blank><IMG alt=FeedSky
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/feedsky.gif" border=0></A>
<DD><A
href="http://www.xianguo.com/subscribe.php?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到鲜果
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_xianguo.jpg" border=0></A>
<DD><A
href="http://fusion.google.com/add?feedurl=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到Google
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_google.gif" border=0></A>
<DD><A
href="http://www.zhuaxia.com/add_channel.php?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到抓虾
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_zhuaxia.gif" border=0></A>
<DD><A
href="http://www.bloglines.com/sub/http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到BlogLines
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_bloglines.gif" border=0></A>
<DD><A
href="http://add.my.yahoo.com/rss?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到Yahoo
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_yahoo.gif" border=0></A>
<DD><A
href="http://rss.gougou.com/find_rss.jsp?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到GouGou
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_gougou.gif" border=0></A>
<DD><A
href="http://www.pageflakes.com/subscribe.aspx?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到飞鸽
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_pageflakes.gif" border=0></A>
<DD><A
href="http://www.rojo.com/add-subscription?resource=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到Rojo
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_rojo.gif" border=0></A>
<DD><A
href="http://www.newsgator.com/ngs/subscriber/subfext.aspx?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到newsgator
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_newsgator.gif" border=0></A>
<DD><A
href="http://www.netvibes.com/subscribe.php?url=http://blog.csdn.net/fmddlmyy/Rss.aspx"
target=_blank><IMG alt=订阅到netvibes
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/rss_netvibes.gif"
border=0></A></SPAN> </DD></DL></DIV></DIV></DIV>
<DIV id=csdnblog_content>
<DIV class=gutter>
<SCRIPT src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/PrintNotice.js"
type=text/javascript></SCRIPT>
<DIV class=default_contents>
<DIV class=user_article>
<SCRIPT src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/LoadFeedbackCount.js"
type=text/javascript></SCRIPT>
<H1><IMG height=16 alt=原创
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/authorship.gif" width=15
border=0> <A
href="http://blog.csdn.net/fmddlmyy/archive/2008/07/16/2663481.aspx">谈谈对齐(上)</A><CITE
class=fav_csdnstylebykimi><A class=fav_csdnstylebykimi title=收藏到我的网摘中,并分享给我的朋友
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A></CITE></H1>
<DIV class=blogstory>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>
<H1>谈谈对齐(上)</H1>
<P>对齐问题主要有3点:变量对齐、结构对齐和数据对齐。前两点是编译器决定的变量映射和结构布局。最后一点与CPU的架构(CISC/RISC)有关。</P>
<P>在大多数情况下,对齐是编译器和CPU的事情,和程序员没什么关系。但在某些情况下,程序员又必须考虑对齐问题,否则会有一些麻烦。</P>
<H2>0 约定和预备知识</H2>
<H3>0.1 地址边界</H3>
<P>如果把字节看作小房子,内存就是顺序排列的小房子。每个小房子都有一个顺序编号的门牌号码,例如:0,1,2,...,0xffffffff。我们把这个门牌号码称作地址。本文将2的整数倍的地址记作2n边界,将4的整数倍的地址记作4n边界,依此类推。显然每个地址都是1n边界,每个4n边界都是2n边界,每个8n边界都是4n边界。</P>
<P>所谓“对齐”就是把变量放在什么样的地址边界上,例如:1n边界,2n边界,还是4n边界。</P>
<H3>0.2 变量的分类</H3>
<P>分类源自角度。有多少角度,就有多少分类。最近经常被迫收听“One World, One
dream”,其实在我看来,每个生命都有独一无二的梦想,何况国家。如果狗熊有宗教信仰,它心目中的上帝应该是一只相貌儒雅的狗熊吧。</P>
<H4>0.2.1 基本类型和复合类型</H4>
<P>从构成看,变量可以分为基本类型的变量和复合类型的变量。基本类型就是语言内部支持的简单类型,例如char, short, int,
double等。复合类型由基本类型组成,例如结构。本文将基本类型的变量记作基本变量,将复合类型的变量记作复合变量或结构变量。</P>
<P>基本变量的长度目前有1、2、4、8字节。以后可能会有更大的基本变量。嵌入式环境通常不支持浮点,常见的长度是1、2、4字节。</P>
<H4>0.2.2 变量的地址</H4>
<P>从地址看,变量可以分成有确定地址的变量和没有确定地址的变量。所谓“有确定地址”就是指在程序运行前就有确定的地址。而“没有确定地址”的变量,它们的地址是在运行时确定的。</P>
<P>全局变量和静态变量都有确定地址。局部变量和动态分配的变量没有确定地址。本文将有确定地址的变量记作有址变量。</P>
<H2>1 变量对齐</H2>
<H3>1.1 没有确定地址的变量</H3>
<P>局部变量是从堆栈分配的,编译器通常会保证每个局部变量的地址都在4n边界上。</P>
<P>动态分配的变量是从堆上分配。堆的实现与标准库和操作系统有关。在一些简单的嵌入式系统中,我们需要自己实现动态内存分配,这时我们要保证每次分配的内存块地址都在4n边界上,以避免后面谈到的数据对齐问题。</P>
<H3>1.2 有确定地址的变量</H3>
<P>有址变量的地址是在链接时确定的。编译器通常有设置变量对齐方式的编译选项,我们通常使用该选项的默认值。在默认情况下,编译器会按照默认方式对齐放置有址变量。</P>
<P>所谓按“按默认方式对齐”,就是将长度为1的基本变量放在1n边界上。将长度为2的基本变量放在2n边界上。将长度为4的基本变量放在4n边界上,依此类推。</P>
<P>每个结构变量总是由一个个基本变量构成。结构变量按照该结构中最长的基本变量对齐。如果某个结构基本变量的最大长度是1,编译器就可以把这个结构放在1n边界上。如果某个结构基本变量的最大长度是4,编译器就应该把这个结构放在4n边界上。</P>
<P>那么结构中的成员变量又是怎样对齐的?</P>
<P class="right articalinfo">发表于 @ <A title=permalink
href="http://blog.csdn.net/fmddlmyy/archive/2008/07/16/2663481.aspx">2008年07月16日
23:41:00</A>|<A title=评论
href="http://blog.csdn.net/fmddlmyy/archive/2008/07/16/2663481.aspx#FeedBack">评论(<SPAN
id=FeedbackCount_2663481>loading...</SPAN>
<SCRIPT type=text/javascript>AddFeedbackCountStack("2663481")</SCRIPT>
)</A>|<A title=编辑
href="http://writeblog.csdn.net/PostEdit.aspx?entryId=2663481">编辑</A>|<CITE
class=fav_csdnstylebykimi><A class=fav_csdnstylebykimi title=收藏到我的网摘中,并分享给我的朋友
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A></CITE></P><SPAN
id=Post.ascx_ViewPost_PreviousAndNextEntriesDown>
<H3><A
href="http://blog.csdn.net/fmddlmyy/archive/2008/07/17/2668634.aspx">新一篇: 谈谈对齐(中)</A> | <A
href="http://blog.csdn.net/fmddlmyy/archive/2008/07/15/2656344.aspx">旧一篇: 一个编译器的小陷阱</A></H3></SPAN></DIV>
<DIV id=Post.ascx_TagAd_palTagAd>
<DIV class=tagadfornews id=csdn_tag_adstyle></DIV></DIV></DIV>
<DIV class=commentslist><SPAN id=Anthem_Post.ascx_Comments_ltlComments__><SPAN
id=Post.ascx_Comments_ltlComments>
<DIV id=commentslist>
<H3>评论:没有评论。</H3></DIV></SPAN></SPAN></DIV>
<DIV class=spacecommment>
<DIV id=Anthem_Post.ascx_PostComment_CommentUpdatePanel__>
<DIV id=Post.ascx_PostComment_CommentUpdatePanel>
<FIELDSET><LEGEND>发表评论<DFN>只有登录用户才能发表评论!<A
href="http://passport.csdn.net/member/UserLogin.aspx?from=http://blog.csdn.net/fmddlmyy/archive/2008/07/16/2663481.aspx">登录</A> <A
href="http://passport.csdn.net/CSDNUserRegister.aspx">注册</A></DFN></LEGEND><EM><IMG
alt=只有登录用户才能发表评论!请登录或注册
src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/blog_commentnotice.gif"></EM>
</FIELDSET> </DIV></DIV></DIV>
<SCRIPT type=text/javascript>
LoadFeedbackCount();//加载评论
document.write("<img src='http://counter.csdn.net/pv.aspx?id=24' border=0 width=0 height=0>");// 计数器
</SCRIPT>
</DIV></DIV></DIV>
<DIV id=pubfooter>
<DL>
<DT>
<DD>Csdn Blog version 3.1a
<DD>Copyright © 吕杰 </DD></DL></DIV></DIV></FORM>
<SCRIPT src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/counter.js"
type=text/javascript></SCRIPT>
<!-- *** Vdoing Code *** -->
<SCRIPT src="谈谈对齐(上) - fmddlmyy的专栏 - CSDNBlog.files/34089.js"
type=text/javascript charset=UTF-8></SCRIPT>
<NOSCRIPT><A title="Vdoing StatsX No.34089" href="http://www.vdoing.com/"><IMG
src="" border=0></A></NOSCRIPT>
<!-- *** End of Vdoing Code *** --></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -