C++面试题(二)

11.sizeof的用法

sizeof的作用是返回一个对象或类型所占用的内存字节数。
1.对于简单内置类型如int、float等,它们的大小与内存相关;关于在不同的机器中它们到底占多少个字节,见字节数
2.对于结构体和类,它们在内存中所占的字节数涉及到对齐的问题:
编译器默认对结构体进行处理,让宽度为2的基本数据类型都位于能被2整除的地址上,让宽度为4的数据类型处在能被4整除的地址上;这样俩个数之间可能需要填充字节,整个结构体的sizeof值就增长了。一般而言,字节对齐满足三个原则:
a.结构体变量的首地址能够被其最宽基本类型成员的大小所整除
b.结构体的每个成员相对结构体首地址的偏移量都是成员大小的整数倍
c.结构体的总大小为结构体最宽基本类型成员大小的整数倍
空结构体的sizeof值为1,编译器为空的类和结构体分配一个字节的空间用于占位;
3.联合体的sizeof是每个成员的sizeof的最大值
4.数组的sizeof为数组所占用的内存字节数,当数组为形参时,sizeof的值相当于指针的sizeof
5.指针的sizeof大小等于计算机内部地址总线的宽度(32位机器为4),与所指对象无关
6.函数的sizeof是函数返回值的大小,函数本身不被调用;不可以对返回值类型为空的函数求大小,不可以只对函数名求值,带参数的函数必须写上实参表
7.类的sizeof的影响因素有:
a>非静态数据成员的大小,静态成员在静态存储区分配了内存空间,而类的对象分配在堆上,所以在计算大小时,不计算静态成员。
b>数据成员的顺序,数据成员的顺序之所以会影响类的大小,是因为对齐方式不同,比如int a; short b; char c 对齐之后大小为8,short b; int a; char c 对齐之后为12
c>字节校正与对齐,同上
d>基类的大小,子类的大小受父类的影响,因为子类继承了父类的成员
e>是否存在虚函数,类中有虚函数会增加4(32位)/8(64位)个字节,不管有多少个虚函数(可以是自己的也可以是继承的),只增加4(32位)/8(64位)个字节;因为只有一个虚函数表。
f>使用的编译器
g>继承模型,是否是虚继承,在虚继承的情况下,还要额外添加一个虚指针(4(32位)/8(64位)),但同样需要注意一个函数只有一个自己的虚指针;也就是说如果B虚继承A,C虚继承A,D继承B,C则只算一个虚指针的大小;如果B虚继承A,C虚继承D,E继承B,C则需算俩个虚指针。

例:

class A {}; sizeof(A) = 1;
class A {virtual fun()}; sizeof(A) = 4(32位)/8(64位)
class A {static int a;}; sizeof(A) = 1;
class A {int a}; sizeof(A) = 4;
class A {static int a; int b;}; sizeof(A) = 4

12.C++ STL介绍

STL是对泛型编程思想的实现,从广义上分为三类:算法、容器、迭代器。其中算法部分主要有<algorithm>、<numeric>、<functional>组成,实现了常用的算法;容器主要实现了一些数据结构如向量、列表等,迭代器是一种允许程序员检查容器内元素,并实现元素遍历的数据类型;C++为每一种标准容器定义了一种迭代器类型,提供了比下标操作更加一般化的方法。

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/80048553
今日推荐