解析C语言中位字段内存分配的问题

爱你爱疯子

爱你爱疯子

2016-02-19 09:11

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

C语言的位字段是个比较有意思的特性。它的目的是在一个机器字中保存多个对象(每个对象占据若干bit),从而节省内存资源,同时又避免复杂的位运算。在此不再讨论位字段的具体语法,下面将研究位字段的存储特性。

先说含有多个字段(field)的字(word)所占空间的规律——含有多个字段的字的大小是所有字段的类型中的最长的那个的倍数。但要确定究竟是最长类型的几倍则比较复杂,这要看是否需要考虑类型对齐问题(即一个字段能否跨越两个最长类型)。

例1:

struct word {
char  field1 : 1;
char  field2 : 2;
int     field3 : 4;
};

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

前两个字段都是char类型,第三个是int类型,所有类型中最长的是int类型。所以字的大小是int类型长度(即4字节)的倍数。而size of word的结果是4字节(即int的1倍),这是因为word的三个字段总共7位(1+2+4),小于int的32位,且不需 考虑类型对齐问题。

例2:

struct word {
char  field1 : 1;
char  field2 : 2;
int     field3 : 30;
};

与上例一样, 所有 类型中最长的是 int类型。所以字的大小是int类型长度(即4字节)的倍数。而size of word的结果是8字节(即int的2倍),这是因为word的三个字段总共33位(1+2+30),需要两个int的64位才能装下, 且不需 考虑类型对齐问题。

例3:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

struct word {
char  field1 : 3;
char  field2 : 6;
char  field3 : 3;
};

所有 类型中最长的是 char类型。所以字的大小是char类型长度(即1字节)的倍数。在linux下size of word的结果是3字节(即char的3倍)。如果只考虑word的三个字段总共12位(3+6+3),需要两个char的16位即能装下,但是在linux的gcc实现下,第二个字段不能跨越两个char(为了对齐),所以三个字段各占一个字节。共3字节。但 一个字段能否跨越两个最长类型是由具体的实现决定的。

其次,我们讨论word内各个field的存储,这个和具体的实现有关。有的是从左向右分配的,有的是从右向左分配的。这个没有规律可言。

最后,对word中的field不能进行取地址操作,这是因为指针需要对齐。但可以对word进行取地址操作。

展开更多 50%)
分享

猜你喜欢

解析C语言中位字段内存分配的问题

编程语言 网络编程
解析C语言中位字段内存分配的问题

c语言中位字段与结构联合的组合使用详解

编程语言 网络编程
c语言中位字段与结构联合的组合使用详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C语言中多维数组的内存分配和释放(malloc与free)的方法

编程语言 网络编程
C语言中多维数组的内存分配和释放(malloc与free)的方法

详细解析C语言中的sizeof

编程语言 网络编程
详细解析C语言中的sizeof

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

解析C语言中如何正确使用const

编程语言 网络编程
解析C语言中如何正确使用const

基于C语言中段错误的问题详解

编程语言 网络编程
基于C语言中段错误的问题详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

word在不删除原有字符的情况下将其替换为下标

word在不删除原有字符的情况下将其替换为下标

JS控制CSS样式的方法

JS控制CSS样式的方法
下拉加载更多内容 ↓