
某些信息在存储时不需要占用完整的字节. 有时只需要占用一个或几个二进制位. 为了节省存储空间并简化处理,C语言提供了一种数据结构,该结构成为字段“或”位段”.
C和C ++允许您指定占用一定位数的结构成员. 字段类型应为整数或枚举,后跟冒号: ,后跟数字,该数字指定使用的位数,并且可以使用未命名的字段来提供空格. 每个成员称为一个位字段. 示例:
1 struct reg 2 { 3 unsigned int SN:4; 4 unsigned int :4; 5 bool good: 4; 6 };
联合和结构的存储顺序是所有成员都是从本地地址开始存储的.
联合占用的内存大小应基于联合成员占用的最大内存,并应考虑对齐问题.
大端存储格式: 数据的高字节存储在低位地址,低字节存储在高位地址.
小尾数存储格式: 数据的高字节存储在高地址中,低字节存储在低地址中.
当输出printf函数时,要输出的变量保存在堆栈上,最后一个输出首先被压入堆栈,最后一个要输出的变量最后被压入堆栈.
printf函数首先将最右边的元素放在堆栈上. 如果堆栈上的元素是char,short和其他类型的小于4个字节的元素,那么在堆栈时它们也将占用4个字节,因此printf(“%d%d”,'a','b');不会发生. 输出错误(如果堆栈不是4个字节,则输出堆栈时将输出4个字节,将发生错误);当它大于4个字节(例如longlong)时,实际的字节数将被压入堆栈. 通过只需要字符串的指针将字符串参数压入堆栈.

一个关键点是: 将char,short和其他类型放入堆栈时,高位用0或1填充.
当数字是无符号类型(例如unsignedshort)时,高位始终用1填充;当数字是有符号类型(例如short)时,高位用符号位填充.
大小结尾还影响位字段的存储. 如果定义的数据结构包含位字段,则将根据以下规则进行存储:
1)低字节存储在低地址中;
2)大端模式首先为该字段的高位分配空间,小端模式首先为该字段的低位分配空间;
3)大端模式首先存储地址的高位,而小端模式首先存储地址的低位.
C ++的枚举工具提供了另一种创建符号常量的方式,该符号常量可以替换const. 使用枚举的语法类似于使用结构的语法.
枚举是用户定义的类型. 定义的基本格式为:
枚举枚举类型名称{枚举常数1 [=整数常数],枚举常数2 [=整数常数],枚举常数3 [=整数常数] .......} [变量名列表]

大括号中的内容成为一个枚举表sizeof计算结构体大小,并且其中的每个项目都成为一个枚举常量. []中的整数值将初始值分配给枚举常数,可以将其省略. 一个不同的整数值会自动分配给每个枚举常量. 在枚举表中分配常量后,将按照顺序加1的规则为后续成员分配初始值.
sizeof是单目运算符,不是函数. sizeof运算符以字节为单位给出其操作数在内存中的存储大小. 操作数可以是括号中的表达式或类型名称,括号中的各种运算都将被忽略. 例如,不会执行sizeof(++)中的++.
sizeof(“ \ 0”)= 2.
汉字在内存中占用的字节数与系统有关. 通常,在Windows下,它占用2个字节. 但是,在Linux环境中,如果系统使用UTF-8编码,则汉字占用3个字节.
当数组用作形式参数时,数组名称用作指针. 此时,sizeof(数组名称)= sizeof(指针);对于32位系统为4.
结构空间的计算较为复杂,通常遵循两个原则:
1)总体空间是最大成员(类型)占用的字节数的整数倍,但是在32位linux + gcc环境中,如果最大成员类型所占用的字节数超过4 ,如果double是8,则整个空间可以是4的整数倍.
2)数据对齐的原理----内存按结构成员的顺序排列. 将其布置到成员变量时,放在其前面的空间大小必须是成员类型大小的整数倍. 如果还不够,它将完成,并且将向后进行类比. 但是,在linux + gcc环境下,如果某种类型占用的字节数超过4,例如double是8,则已经放在前面的空间是4的整数倍,并且如果这还不够.
当其他结构嵌套在该结构中时,以上两个原则应修改为以下两个:

1)总体空间是在子结构和父结构中占据最大空间的成员(类型)所占用字节数的整数倍,但是在linux + gcc环境中,如果单词被最大的成员类型部分的数量超过4sizeof计算结构体大小,如果double是8,则整个空间可以是4的整数倍.
2)数据对齐的原理---父结构按结构成员的顺序排列. 当将其布置在子结构上时,布置在其前面的空间必须是子结构成员中最大的一个. 如果大小不够,请填充大小的整数倍,以此类推. 但是,在linux + gcc环境下,如果某个成员类型占用的字节数大于4,例如double为8,则放在前面的空间大小为4的整数倍,并且如果不够的话,它将被填充.
在结构中,根据单个变量而不是整个变量将数组一个接一个地放置.
不能通过sizeof单独对位字段成员进行赋值,但是sizeof可以用于获取包含位字段的结构的大小.
使用位字段的主要目的是压缩和存储,一般规则是:
1)如果相邻位字段的类型相同,并且它们的位宽之和小于该类型的大小,则以下字段将存储在前一个字段的旁边,直到无法容纳为止.
在vs2010环境中,inta: 4,如果不是位字段,则占用4个字节,在Dev-c ++和linux + gcc环境中,无论它是什么类型,占用的字节数以时间所占的字节数为准,以便于后续结构成员的放置,即int: 4. 如果后面不是位字段,则仅占用1个字节.
2)如果相邻位字段的类型相同,但是它们的位宽之和大于该类型的大小,则其后的字段将从新存储单元开始,并且偏移量将是类型大小的整数倍.
3)如果相邻位字段的字段类型不同,则每个编译器的具体实现也不同. VC6不采用压缩,而Dev-c ++和linux + gcc采用压缩方法.

4)如果非位字段散布在位字段之间,则不执行压缩.
5)整个结构的总大小是最宽的基本类型成员的大小的整数倍.
#pragma pack(n)编译器将按n个字节对齐
#pragma pack()取消自定义字节对齐.
请注意,如果结构成员中最大成员类型的大小小于n,则n无效,即根据结构中最大类型成员的大小对齐,否则,将n对齐.
offsetof(item)= min(n,sizeof(item))
#pragma pack(推送)将当前包设置保存到堆栈中
#pragma pack(pop)恢复以前的包设置
枚举仅定义一个常量集,没有“元素”,并且枚举类型存储为int类型,因此枚举类型的sizeof值为4.
今天{enumday {morning,moon,moonmoon}今天;
sizeof(day)= 4,sizeof(today)= 4;
字符串名称;
name.size()计算长度,不包括'\ n';
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-229322-1.html
怎样算出来的