sizeof的使用---sizeof,,字节对齐,位域

原帖: http://blog.csdn.net/gausswang/archive/2009/11/28/4894313.aspx
==================================================
阅读笔记:
===========
A: sizeof语法
sizeof有三种语法形式,如下:

       1) sizeof( object ); // sizeof( 对象 );
   2) sizeof( type_name ); // sizeof( 类型 );
   3) sizeof object;    // sizeof 对象;
实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。这里所指的对象可以进一步延伸至表达式和函数调用(不是函数名):
sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小, 一般不会对表达式进行计算。

sizeof也可以对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。
eg.: sizeof(2+3.14); //ok
sizeof(foo());    //ok
sizeof(foo);       //error!

============================================================
B: sizeof的常量性:
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用.
eg.: char ary[ sizeof( int ) * 10 ]; // ok

============================================================
C:指针变量的sizeof
指针变量的sizeof值与指针所指的对象没有任何关系,对于32位系统中任意类型的指针变量p,sizeof(p)=4.

============================================================
D:数组的sizeof
数组的sizeof值等于数组所占用的内存字节数;
但是, 当数组作为函数参数时,在被调函数中的数组sizeof就不一样了哦。
为什么? 想想“传值”与“传址”的   区别吧!
============================================================
E: 结构体的sizeof
此部分,字节对齐必须得了解.
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

   1) 结构体的 首地址能够被其 最宽基本类型成员的大小所整除
   2) 结构体每个成员相对于结构体首地址的 偏移量(offset)都是 成员大小的整数倍,如有需要编译器会
在成员之间加上填充字节(internal adding);
   3) 结构体的 总大小为结构体 最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后
加上填充字节(trailing padding)。
ps: a.由于结构体的成员可以是复合类型(包含子结构体),所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员(将子成员"打散"),而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。


最后,空结构体的sizeof值大小为1. (不同编译器的结果不一样,gcc有可能为0 http://blog.csdn.net/Treazy/archive/2007/12/21/1957287.aspx ).

============================================================

F:位域:    C语言提供的一种可以按位存储的数据结构.

http://hi.baidu.com/dljaye/blog/item/5f514844748c8e46510ffe86.html

http://blog.csdn.net/gausswang/archive/2009/11/28/4894313.aspx

写了几个程序测试, 位域成员的赋值和引用和一般的变量没有区别,无非就是在定义结构体的时候特殊指出用几位. 当然,指定了成员所用位数,也就存在对应的取值范围和溢出的问题了.

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

struct test1
{
char a:3;
long b:5;
char c:2;
};
int len = sizeof(test1);//答案为:2

struct test2
{
char a:1;
char :2;
long b:3;
char c:2;
};
int len = sizeof(test2);  //答案为:12.

弄清楚上面连个例子的答案是怎么来的,此部分就结业了,^_^

============================================================
完!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值