<script type="text/javascript"> <!-- csdn_AD_Position_GroupID = "{f05ff3bf-246b-4d71-a101-b5d4ee3f6cd3}"; csdn_AD_Page_Url = document.location; csdn_AD_CurrPage_CharSet = "gb2312"; //--> </script><script src="http://ggmm.csdn.net/ggmm/Show_JavaScript.js" type="text/javascript"> </script><script language="JavaScript1.1" src="http://ggmm.csdn.net/GGMM/ShowJavaScriptGGMM.aspx?show=true&position={f05ff3bf-246b-4d71-a101-b5d4ee3f6cd3}&CharSet=gb2312" type="text/javascript"> </script> <script type="text/javascript"> <!-- csdn_AD_Position_GroupID = "{a07a8ddc-9f6e-4eaa-99f1-59e0c7a3a08b}"; csdn_AD_Page_Url = document.location; csdn_AD_CurrPage_CharSet = "gb2312"; //--> </script><script src="http://ggmm.csdn.net/ggmm/Show_JavaScript.js" type="text/javascript"> </script><script language="JavaScript1.1" src="http://ggmm.csdn.net/GGMM/ShowJavaScriptGGMM.aspx?show=true&position={a07a8ddc-9f6e-4eaa-99f1-59e0c7a3a08b}&CharSet=gb2312" type="text/javascript"> </script> 首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才 移 动∣专 题∣SUN∣IBM∣微 软∣微 创∣精 华∣Donews∣人 邮 我的技术中心 我的分类我的文档全部文章发表文章专栏管理使用说明 <script type="text/javascript"> <!-- google_ad_client = "pub-1076724771190722"; google_ad_width = 125; google_ad_height = 125; google_ad_format = "125x125_as"; google_ad_channel =""; //--> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1076724771190722&dt=1127999126296&lmt=1127702876&format=125x125_as&output=html&url=http%3A%2F%2Fdev.csdn.net%2Fdevelop%2Farticle%2F77%2F77435.shtm&ref=http%3A%2F%2Fwww.csdn.net%2FLoginPageSideColumns.aspx&cc=217&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="125" scrolling="no" height="125" allowtransparency="65535"> RSS 订阅 最新文档列表 Windows/.NET.NET (rss) Visual C++ (rss) Delphi (rss) Visual Basic (rss) ASP (rss) JavaScript (rss) Java/LinuxJava (rss) Perl (rss) 综合其他开发语言 (rss) 文件格式 (rss) 企业开发游戏开发 (rss) 网站制作技术 (rss) 数据库数据库开发 (rss) 软件工程其他 (rss) 积极原创作者 fatalerror99 (45)zeroless (17)ilovevc (26)redbeans (4)jerryfleming (5)eXile_ (1)Amoon100 (10)machozhao (2)fire_woods (7)BigFanOfCpp (12) CSDN - 文档中心 - 其他开发语言 阅读:0 评论: 0 参与评论 标题 由朗讯的一道笔试题想到的! 选择自 cxyol 的 Blog 关键字 由朗讯的一道笔试题想到的!出处 朗讯的笔试题是这样的:Typedef union student { Char name[10]; Long sno; Char sex; Float score [4]; } STU; Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } 答案是80 ,因为union是可变的以其成员中最大的成员作为 该union的大小!但是换成是 struct又是多少呢?Typedef struct student { Char name[10]; Long sno; Char sex; Float score [4]; } STU; Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } 答案是 180 ????为什么不是 (10+4+1+16)*5=155? 因为struct 有个叫对齐方式的问题: 不对齐的数据存取在x86上影响速度,因为在不对齐的时候,对于小的可能会影响 其效率,对齐即是多分配一些字节,填充无用数据,以空间的损失来换取消率。 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如array、struct、union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对齐(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。 自然对齐(natural alignment)即默认对齐方式,是指按结构体的成员中(类型)size最大的成员作为基本的分配单元,而且与其顺序有这密切的联系。 例如:struct naturalalign{ char a; short b; char c;}; 在上述结构体中,size最大的是short,其长度为2字节,因而结构体中的char成员a、c都以2为单位对齐,sizeof(naturalalign)的结果等于6; 如果改为:struct naturalalign{ char a; int b; char c;}; 其结果显然为12。 那么再回到到原题:结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;Long sno; 4个字节;Char sex; 4个字节(这里对齐了);Float score [4]; 16个字节。于是(12+4+4+16)×5=180,就是了! 刚才还说过,与顺序有关,呵呵,我们改一下: Typedef struct student { Char name[10]; Char sex; Long sno; Float score [4]; } STU; Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } 答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这);Float score [4]; 16个字节。于是(12+4+16)×5=160,就是了!所以要小心呀!2.2指定对齐 一般地,可以通过下面的方法来改变缺省的对齐条件: · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐; · 使用伪指令#pragma pack (),取消自定义字节对齐方式。 注意:如果#pragma pack (n)中指定的n大于结构体中最大成员(类型)的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。 例如:#pragma pack (n)struct naturalalign{ char a; int b; char c;};#pragma pack () 当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。 在VC++ 6.0编译器中,我们可以指定其对齐方式(见图1),其操作方式为依次选择projetct > setting > C/C++菜单,在struct member alignment中指定你要的对界方式。图1:在VC++ 6.0中指定对界方式 另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。Typedef struct student { Char name[10]; Char sex; Long sno; Float score [4]; } STU; Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } 答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这);Float score [4]; 16个字节。于是(12+4+16)×5=160,就是了!所以要小心呀!2.2指定对齐 一般地,可以通过下面的方法来改变缺省的对齐条件: · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐; · 使用伪指令#pragma pack (),取消自定义字节对齐方式。 注意:如果#pragma pack (n)中指定的n大于结构体中最大成员(类型)的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。 例如:#pragma pack (n)struct naturalalign{ char a; int b; char c;};#pragma pack () 当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。 在VC++ 6.0编译器中,我们可以指定其对齐方式(见图1),其操作方式为依次选择projetct > setting > C/C++菜单,在struct member alignment中指定你要的对界方式。图1:在VC++ 6.0中指定对界方式 另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。Typedef struct student { Char name[10]; Char sex; Long sno; Float score [4]; } STU; Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } Main () { STU a[5]; Printf(“%d/n”,sizeof(a); } 答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这);Float score [4]; 16个字节。于是(12+4+16)×5=160,就是了!所以要小心呀!2.2指定对齐 一般地,可以通过下面的方法来改变缺省的对齐条件: · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐; · 使用伪指令#pragma pack (),取消自定义字节对齐方式。 注意:如果#pragma pack (n)中指定的n大于结构体中最大成员(类型)的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。 例如:#pragma pack (n)struct naturalalign{ char a; int b; char c;};#pragma pack () 当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。 在VC++ 6.0编译器中,我们可以指定其对齐方式(见图1),其操作方式为依次选择projetct > setting > C/C++菜单,在struct member alignment中指定你要的对界方式。图1:在VC++ 6.0中指定对界方式 另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。 作者Blog: http://blog.csdn.net/cxyol/ 相关文章 由朗讯的一道笔试题想到的! 对该文的评论 【评论】 【关闭】 【报告bug】 网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式 - English 北京百联美达美数码科技有限公司 版权所有 京ICP证020026号Copyright © CSDN.NET, Inc. All Rights Reserved <script type="text/javascript"> document.write("<img src=http://count.csdn.net/count/pageview1.asp?columnid=4&itemid=11 border=0 width=0 height=0>"); </script>