c语言结构体的偏移、c++

c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法

原则有三个:

a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0,

例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要“首部填充”;以此类推

b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行“末尾填充”;

c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须为B中所含成员数据长度最大值的整数倍,

如若B中成员为int,double,char,则B的偏移量要为8的整数倍;否则进行“中间填充”

---------------------------------------------------------------------------------------------------------------

关于c++/c中的sizeof

sizeof(a)返回的是a的类型数据所占据的字节数,常见的数据类型字节数都比较好理解,列出一些比较特殊的以供参考:

1.当定义一个字符数组char a[](定义时必须赋值否则编译不通过),且不显示声明该数组的长度时,该数组的长度为你给他复制时的字符个数+1;

2.结构体中有关位置偏移,见上面;

3.所有指针类型的变量都占4个字节;

4.自定义的类class如果不含任何成员则长度为1;否则class和struct 的数据对齐原则一致;

5.sizeof()计算时只计算存放在栈中的空间,static等声明的全局变量存放在静态数据空间不会计算在内;

----------------------------------------------------------------------------------------------------------------

指针和数组名的区别:

定义一个指针char *a="abcd";定义一个数组char b[]="abcd";

则想得到字符‘b’时可以通过a[1]与b[1]得到,而且a和b都可以进行加减运算,这样来看a与b的差别实在不明显;但a与b的区别还是有,最典型的sizeof(a)=4(指针的空间);sizeof(b)=5(整个数组的空间);具体参照文章:http://wenku.baidu.com/view/678d1925a5e9856a561260b1.html

------------------------------------------------------------------------------------------------------------

sizeof()与strlen()的区别,列举如下

1.前者可以用于大部分数据类型,后者只用于字符指针;

2.char a[]="abcd";则sizeof(a)=5;strlen(a)=4;char b[100]="abcd";sizeof(b)=100;strlen[b]=4;strlen在读到'\0'结束符就停止计数;

3.char a[]={'a','b','c'},char b={'a','b','c','\0'};则sizeof(a)=3;strlen(a)=??(实验了下等于5,不过不知道为什么??);sizeof(b)=4;strlen(b)=3;证明了第2点;而且注意下char a[]="abcd";和.char a[]={'a','b','c'}这两种初始化方式的区别,前者会自动补上'\0'结束符,后者不会;

4,看到一句话说sizeof()是数符,而strlen是函数,对理解他们应该没多大意义,可能在表达式中的地位有点区别;sizeof后面如果是变量名可以省括号,如果是类型名不能省;

---------------------------------------------------------------------------------------------------------------------------------------------

关于inline函数注意如下几点:

1.inline函数的声明如下:inline 函数声明;

2.inline函数定义和声明通常全部放在头文件中,因为inline函数会在编译阶段被替换为函数代码,不用到call/return机制,如果在一个.c中定义内联函数,则在其他文件中无法用该函数;宏在编译前处理(编译预处理阶段),inline在编译阶段处理;

3.inline函数和宏的区别在于inline函数在替换时会进行类型检查,而且inline函数的声明对于编译器而言只是建议性的,编译器会自身优化;

4.虚函数肯定不会是内联函数,虚函数是在运行时决定调用哪个函数,而内联函数在编译阶段就会被替换为代码块,函数名符号根本就不存在了;

5.内联函数的主要作用在于节约了资源,消除了一个call/return机制;

-----------------------------------------------------------------------------------------------

关于虚函数和纯虚函数注意以下几点:

1.虚函数的定义:virtue 函数声明;纯虚函数定义: virtue 函数声明=0;

2.含有纯虚函数的类叫做虚基类,这种类无法直接生成对象;

3.虚函数集中体现了继承的多态性,及继承自同一个基类的不同子类可以表现出不同的性质;虚函数是实用继承:不仅继承基类的接口,还继承基类接口的初始功能,当然这些接口也可以在子类中重新自行定义;纯虚函数只是继承了基类的接口,要实现怎样的功能都要在子类中定义;








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章