免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4697 | 回复: 14
打印 上一主题 下一主题

关于结构体的sizeof,大家帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-18 10:17 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         struct s1
  5.         {
  6.                 char c1;
  7.                 int  i;
  8.                 char c2;
  9.         }p1;
  10.         struct s2
  11.         {
  12.                 char c1;
  13.                 char c2;
  14.                 int i;
  15.         }p2;
  16.        
  17.         printf("p1_size=%d,p2_size=%d\n",sizeof(p1),sizeof(p2));
  18. }
复制代码


gcc下编译运行,结果p1_size=12, p2_size=8

有点疑问,如果按结构体最宽基本类型成员大小对齐的话,

  1. struct s1
  2.         {
  3.                 char c1;               4
  4.                 int  i;                    4
  5.                 char c2;                4
  6.                 }
复制代码
      
这个可以理解  



  1. struct s1
  2.         {
  3.                 char c1;
  4.                 char c2;
  5.                 int i;
  6.                 }
复制代码
      
请问这个是怎么对齐的?

论坛徽章:
0
2 [报告]
发表于 2006-12-18 10:25 |只看该作者
很简单啊
char 1
char 1
填充 2
int 4

所以说   最好是先小后大 这样子的话 可以节约一些内存的

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-12-18 10:27 |只看该作者
第二个的内存布局应该是:
第一个字节放c1,第二个字节放c2,然后空2个字节,后面四个字节放i。

论坛徽章:
0
4 [报告]
发表于 2006-12-18 10:27 |只看该作者
原帖由 DraculaW 于 2006-12-18 10:25 发表
很简单啊
char 1
char 1
填充 2
int 4

所以说   最好是先小后大 这样子的话 可以节约一些内存的

为什么要这样填充,根据什么规则?  :)

论坛徽章:
0
5 [报告]
发表于 2006-12-18 10:34 |只看该作者
原帖由 lenovo 于 2006-12-18 10:27 发表
第二个的内存布局应该是:
第一个字节放c1,第二个字节放c2,然后空2个字节,后面四个字节放i。

版主大人能不能讲一下关于结构体的内存对齐的总的规则?

论坛徽章:
0
6 [报告]
发表于 2006-12-18 10:40 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2006-12-18 10:53 |只看该作者
原帖由 boxpei 于 2006-12-18 10:40 发表
http://www.yuanma.org/data/2006/1106/article_1781.htm


谢谢,还是不太明白,在自然边界上对齐是什么意思?

论坛徽章:
0
8 [报告]
发表于 2006-12-18 11:01 |只看该作者
就是说内存以4个字节为单位,因为前一个4字节被一个char占了,那int不能去占剩下的3个字节,因为int是4字节的,
它只好去占下一个4字节

原帖由 liuke432 于 2006-12-18 10:53 发表


谢谢,还是不太明白,在自然边界上对齐是什么意思?

论坛徽章:
0
9 [报告]
发表于 2006-12-18 11:11 |只看该作者
简单的说,自然边界就是能够被该类型长度整除的内存地址,比如说,对int16来说,就是偶数地址。
对结构体来说,自然边界对齐是指结构体成员默认的对齐方式,也就是按照结构体中长度最大的成员变量来对齐。
一些编译器的优化选项可能改变对齐方式。另外 #pragma pack 伪指令也可以强制指定对齐方式。

论坛徽章:
0
10 [报告]
发表于 2006-12-18 11:59 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP