﻿<?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++博客-海子海</title><link>http://www.cppblog.com/fangzdi/</link><description>胆大能吃苦有钱没文化</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 09:27:59 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 09:27:59 GMT</pubDate><ttl>60</ttl><item><title> #pragma pack(n)转的</title><link>http://www.cppblog.com/fangzdi/archive/2008/09/15/61867.html</link><dc:creator>海子海</dc:creator><author>海子海</author><pubDate>Mon, 15 Sep 2008 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/fangzdi/archive/2008/09/15/61867.html</guid><wfw:comment>http://www.cppblog.com/fangzdi/comments/61867.html</wfw:comment><comments>http://www.cppblog.com/fangzdi/archive/2008/09/15/61867.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/fangzdi/comments/commentRss/61867.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fangzdi/services/trackbacks/61867.html</trackback:ping><description><![CDATA[<p><font size=2>在C语言中，结构是一种复合数据类型，其构成元素既可以是基本数据类型（如int、long、float等）的变量，也可以是一些复合数据类型（如数组、结构、联合等）的数据单元。在结构中，编译器为结构的每个成员按其自然对界（alignment）条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储，第一个成员的地址和整个结构的地址相同。</font></p>
<p><font size=2>例如，下面的结构各成员空间分配情况：<br>struct test <br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; char x1;<br>&nbsp;&nbsp;&nbsp;&nbsp; short x2;<br>&nbsp;&nbsp;&nbsp;&nbsp; float x3;<br>&nbsp;&nbsp;&nbsp;&nbsp; char x4;<br>};</font></p>
<p><font size=2>结构的第一个成员x1，其偏移地址为0，占据了第1个字节。第二个成员x2为short类型，其起始地址必须2字节对界，因此，编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上，在它们前面不需要额外的填充字节。在test结构中，成员x3要求4字节对界，是该结构所有成员中要求的最大对界单元，因而test结构的自然对界条件为4字节，编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。</font></p>
<p><font size=2><strong>更改C编译器的缺省字节对齐方式<br></strong>在缺省情况下，C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地，可以通过下面的方法来改变缺省的对界条件：<br>&nbsp;&nbsp;&nbsp;&nbsp; &#183; 使用伪指令#pragma pack (n)，C编译器将按照n个字节对齐。<br>&nbsp;&nbsp;&nbsp;&nbsp; &#183; 使用伪指令#pragma pack ()，取消自定义字节对齐方式。</font></p>
<p><font size=2>另外，还有如下的一种方式：<br>&nbsp;&nbsp;&nbsp;&nbsp; &#183; __attribute((aligned (n)))，让所作用的结构成员对齐在n字节自然边界上。<font color=#ff0000>如果结构中有成员的长度大于n，则按照最大成员的长度来对齐。</font><br>&nbsp;&nbsp;&nbsp;&nbsp; &#183; __attribute__ ((packed))，取消结构在编译过程中的优化对齐，按照实际占用字节数进行对齐。</font></p>
<p><font size=2>以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。</font></p>
<p><font size=2>(&nbsp;via <a href="http://blog.csdn.net/wenddy112/articles/300583.aspx"><u><font color=#0000ff>http://blog.csdn.net/wenddy112/articles/300583.aspx</font></u></a>&nbsp;)</font></p>
<p><font size=2>下面有一道在 <a href="http://www.csdn.net/" target=_blank><u><font color=#0000ff>CSDN论坛</font></u></a> 上讨论火热的题：</font></p>
<p><strong><u>Intel和微软和本公司同时出现的面试题</u></strong></p>
<p>#pragma pack(8)</p>
<p>struct s1{<br>short a;<br>long b;<br>};</p>
<p>struct s2{<br>char c;<br>s1 d;<br>long long e;<br>};</p>
<p>#pragma pack()</p>
<p>问 <br>1.sizeof(s2) = ?<br>2.s2的c后面空了几个字节接着是d?</p>
<p>感谢 <a href="http://community.csdn.net/Message_Board/Send.asp?sendto=redleaves" target=_blank><font color=#3366cc><strong><u>redleaves(ID最吊的网友)</u></strong></font></a>&nbsp;的解答，结果如下：</p>
<p>sizeof(S2)结果为24.<br>成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.<br>也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.<br>S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;<br>S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;b<br>S1的内存布局：11**,1111,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp; S1.a S1.b&nbsp;&nbsp;&nbsp;&nbsp; d<br>S2的内存布局：1***,11**,1111,****11111111</p>
<p>这里有三点很重要:<br>1.每个成员分别按自己的方式对齐,并能最小化长度<br>2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度<br>3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐</p>
<p>补充一下,对于数组,比如:<br>char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.<br>如果写: typedef char Array3[3];<br>Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.<br>不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个.</p>
<img src ="http://www.cppblog.com/fangzdi/aggbug/61867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fangzdi/" target="_blank">海子海</a> 2008-09-15 15:18 <a href="http://www.cppblog.com/fangzdi/archive/2008/09/15/61867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的减肥计划</title><link>http://www.cppblog.com/fangzdi/archive/2008/08/06/58186.html</link><dc:creator>海子海</dc:creator><author>海子海</author><pubDate>Wed, 06 Aug 2008 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/fangzdi/archive/2008/08/06/58186.html</guid><wfw:comment>http://www.cppblog.com/fangzdi/comments/58186.html</wfw:comment><comments>http://www.cppblog.com/fangzdi/archive/2008/08/06/58186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fangzdi/comments/commentRss/58186.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fangzdi/services/trackbacks/58186.html</trackback:ping><description><![CDATA[昨天下午去称了一下体重，整整80kg，2008-8-5日<br>希望到9-1日时降到75kg，这个比较现实吧
<img src ="http://www.cppblog.com/fangzdi/aggbug/58186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fangzdi/" target="_blank">海子海</a> 2008-08-06 22:36 <a href="http://www.cppblog.com/fangzdi/archive/2008/08/06/58186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我最近的读书计划</title><link>http://www.cppblog.com/fangzdi/archive/2008/08/04/57917.html</link><dc:creator>海子海</dc:creator><author>海子海</author><pubDate>Sun, 03 Aug 2008 16:00:00 GMT</pubDate><guid>http://www.cppblog.com/fangzdi/archive/2008/08/04/57917.html</guid><wfw:comment>http://www.cppblog.com/fangzdi/comments/57917.html</wfw:comment><comments>http://www.cppblog.com/fangzdi/archive/2008/08/04/57917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fangzdi/comments/commentRss/57917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fangzdi/services/trackbacks/57917.html</trackback:ping><description><![CDATA[<ol>
    <li>C++对象模型</li>
    <li>算法设计与分析习题集解答</li>
    <li>设计模式</li>
    <li>UML用户指南</li>
    <li>C++沉思录</li>
    <li>敏捷软件开发原则模式与实践</li>
    <li>软件体系结构</li>
    <li>软件架构设计</li>
</ol>
<p>Go！</p>
<img src ="http://www.cppblog.com/fangzdi/aggbug/57917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fangzdi/" target="_blank">海子海</a> 2008-08-04 00:00 <a href="http://www.cppblog.com/fangzdi/archive/2008/08/04/57917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>