﻿<?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++博客-gpwang84329</title><link>http://www.cppblog.com/gpwang84329/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:08:07 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:08:07 GMT</pubDate><ttl>60</ttl><item><title>细说 #pragma pack(n)</title><link>http://www.cppblog.com/gpwang84329/archive/2011/10/12/158111.html</link><dc:creator>jerome</dc:creator><author>jerome</author><pubDate>Wed, 12 Oct 2011 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/gpwang84329/archive/2011/10/12/158111.html</guid><wfw:comment>http://www.cppblog.com/gpwang84329/comments/158111.html</wfw:comment><comments>http://www.cppblog.com/gpwang84329/archive/2011/10/12/158111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gpwang84329/comments/commentRss/158111.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gpwang84329/services/trackbacks/158111.html</trackback:ping><description><![CDATA[<div><p>在C语言中，结构是一种复合数据类型，其构成元素既可以是基本数据类型（如int、long、float等）的变 量，也可以是一些复合数据类型（如数组、结构、联合等）的数据单元。在结构中，编译器为结构的每个成员按其自然对界（alignment）条件分配空间。 各个成员按照它们被声明的顺序在内存中顺序存储，第一个成员的地址和整个结构的地址相同。</p> <p>例如，下面的结构各成员空间分配情况：<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 />};</p> <p>结构的第一个成员x1，其偏移地址为0，占据了第1个字节。第二个成员x2为short类型，其起始地址必须2字节 对界，因此，编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上，在它们前面不需要额外的填充字 节。在test结构中，成员x3要求4字节对界，是该结构所有成员中要求的最大对界单元，因而test结构的自然对界条件为4字节，编译器在成员x4后面 填充了3个空字节。整个结构所占据空间为12字节。</p> <p><strong>更改C编译器的缺省字节对齐方式<br /></strong>在缺省情况下，C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地，可以通过下面的方法来改变缺省的对界条件：<br />&nbsp;&nbsp;&nbsp;&nbsp; &#183; 使用伪指令#pragma pack (n)，C编译器将按照n个字节对齐。<br />&nbsp;&nbsp;&nbsp;&nbsp; &#183; 使用伪指令#pragma pack ()，取消自定义字节对齐方式。</p> <p>另外，还有如下的一种方式：<br />&nbsp;&nbsp;&nbsp;&nbsp; &#183; __attribute((aligned (n)))，让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n，则按照最大成员的长度来对齐。<br />&nbsp;&nbsp;&nbsp;&nbsp; &#183; __attribute__ ((packed))，取消结构在编译过程中的优化对齐，按照实际占用字节数进行对齐。</p> <p>以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。</p> <p>(&nbsp;via <a href="http://blog.csdn.net/wenddy112/articles/300583.aspx"><u>http://blog.csdn.net/wenddy112/articles/300583.aspx</u></a>&nbsp;)</p> <p>下面有一道在 <a href="http://www.csdn.net/" target="_blank"><u>CSDN论坛</u></a> 上讨论火热的题：</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"><strong><u>redleaves(ID最吊的网友)</u></strong></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> <p><strong>测试的编译器：</strong></p> <p>GCC 2.95 3.1 3.3 3.4 4.0<br />MS C/C++ 7.0 7.1 8.0 beta<br />Borland C/C++ 5.6 6.0<br />Intel C/C++ 7.0 8.0 8.1<br />DigitalMars C/C++ 8.4<br />OpenWatcom 1.3<br />Codeplay C/C++ 2.1.7</p></div><div>http://www.sf.org.cn/Article/base/200509/260.html</div><img src ="http://www.cppblog.com/gpwang84329/aggbug/158111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gpwang84329/" target="_blank">jerome</a> 2011-10-12 10:23 <a href="http://www.cppblog.com/gpwang84329/archive/2011/10/12/158111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>secuCRT的中文显示问题</title><link>http://www.cppblog.com/gpwang84329/archive/2010/12/03/135328.html</link><dc:creator>jerome</dc:creator><author>jerome</author><pubDate>Fri, 03 Dec 2010 01:19:00 GMT</pubDate><guid>http://www.cppblog.com/gpwang84329/archive/2010/12/03/135328.html</guid><wfw:comment>http://www.cppblog.com/gpwang84329/comments/135328.html</wfw:comment><comments>http://www.cppblog.com/gpwang84329/archive/2010/12/03/135328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gpwang84329/comments/commentRss/135328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gpwang84329/services/trackbacks/135328.html</trackback:ping><description><![CDATA[<div>早上遇到一个问题想在secuCRT中显示中文，方法以前成功过，现在又忘记了。 </div>
<div>中文显示乱码的解决方法：
<div><!--wizrtf2html Charset=134  --><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'">　1.root用户权限下修改远程linux机器的配置vim /etc/sysconfig/i18n;把LANG改成支持UTF-8的中文字符集：LANG=&#8221;zh_CN.UTF-8&#8243;，但不能是 LANG=&#8221;en_US.UTF-8&#8243;；</span></div>
<div><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'">　2.再改SecuCRT的设置,选项-&gt;会话选项-&gt;外观-&gt;字符编码-&gt;UTF-8；注意windows and Text Appearance的方框中Fonts中Normal选项也会影响字符的显示是否为乱码，中文显示可以选择新宋体15pt。另外还有一个地方需要注意fonts里面的字符集需要设置为CHINESE_GB2312。</span></div>
<div><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'">　3.exit退出当前会话，再重新登录。发现utf8的中文文件名称都能正确显示了；</span></div>
<span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'">　另外一些快捷键：Alt+Enter是转换全屏快捷键，或者输入Alt+V弹出菜单，Ctrl+TAB在不同会话窗口切换。Ctrl+F4关闭会话窗口；</span> </div>
<img src ="http://www.cppblog.com/gpwang84329/aggbug/135328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gpwang84329/" target="_blank">jerome</a> 2010-12-03 09:19 <a href="http://www.cppblog.com/gpwang84329/archive/2010/12/03/135328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>