原帖: http://blog.csdn.net/gausswang/archive/2009/11/28/4894313.aspx
==================================================
阅读笔记:
===========
A: sizeof语法
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
此部分,字节对齐必须得了解.
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
在成员之间加上填充字节(internal adding);
加上填充字节(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.
弄清楚上面连个例子的答案是怎么来的,此部分就结业了,^_^
============================================================
完!