免费注册 查看新帖 |

Chinaunix

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

包含int a:2的这个结构体占几个字节呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-08 17:32 |只看该作者 |倒序浏览
typedef struct
{
int a:2;
int b:2;
int c:1;
}test;


typedef struct
{
char a:2;
int b:1;
}test0;
我在Linux下gcc测得test占 4 个字节,感觉怎么不明白呢?
那这种有位域的结构体在内存中占用的字节数该怎么算呢?


另外,test 中 a b c 在内存中是如何存放的呢?
是从右到左紧挨着呢, 还是每个占一个字节的前2位或1位呢?

论坛徽章:
0
2 [报告]
发表于 2009-04-08 17:39 |只看该作者
位域
IA32 是 4 字节对齐
IA32 是小端

论坛徽章:
0
3 [报告]
发表于 2009-04-08 17:40 |只看该作者
test占 4 个字节内存对齐
后面的问题,看看汇编代码

论坛徽章:
0
4 [报告]
发表于 2009-04-08 17:53 |只看该作者
那位域类型若不同怎么算呢?

struct test0{
        int a:2;
        char b:2;
};
struct test1{
        int a;
        char b;
};

在gcc下算得是 test0 占 4 个字节,test1 占 8 个字节!
有点迷惑!
楼上的朋友们说得都不是很清楚。
网上baidu google了一下,说得也不是很清楚!

论坛徽章:
0
5 [报告]
发表于 2009-04-08 19:47 |只看该作者
unaligned_length = sizeof(element_1) + sizeof(element_2) + sizeof(element_3) + ... + sizeof(element_n)

padding = unaligned_length mod alignment

real_length = unaligned_length + padding



[ 本帖最后由 langue 于 2009-4-8 20:05 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-04-08 19:58 |只看该作者
这个帖子里和你问题类似,结果怎么和你不一样,整个代码贴出来看看撒
http://bbs.chinaunix.net/archiver/?tid-68164.html

论坛徽章:
0
7 [报告]
发表于 2009-04-08 20:20 |只看该作者

回复 #5 langue 的帖子

公式有问题吧。
struct node1
{
       char a;
       char b;
       int c;
};
struct node2
{
       char a;
       int c;
       char b;
};

sizeof(node1) != sizeof(node2);

论坛徽章:
0
8 [报告]
发表于 2009-04-08 20:25 |只看该作者

回复 #7 capable 的帖子

不同的编译器之间确实存在差异,似乎标准并未规定应该怎样对齐,所以我给出的只是一种参考。

论坛徽章:
0
9 [报告]
发表于 2009-04-08 21:42 |只看该作者
可能楼上的几位朋友好像没明白我的意思吧?

我主要是想问位域结构体所占内存大小的计算方法!

比如说:
struct test0{
        int a:2;
        char b:2;
};
为什么会占4个字节呢?

struct test2{
      char b:2;  
      int a:2;
};也占4个字节。

为什么呢?

论坛徽章:
0
10 [报告]
发表于 2009-04-08 21:48 |只看该作者
找到这么几句话:
使用位域的主要目的是压缩存储,其大致规则为:

1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP