最近在找新的工作,在找工作中遇到很多面试题,大多数让我很难堪,再次让我认识到自己的知识的匮乏,上份工作是以应届生的身份,所有当时进项目组也没有很多要求,进入项目组后自己还算好学(自己以为),之前也没有相关的经验,自己很自信(其实都是盲目的),在上份工作中遇到几个愿意带我的老员工对我帮助很大(也间接的造成自己很自大),上份工作主要使用C++,经常使用STL(觉得自己掌握的很熟练,面试官问我MAP和LIST的区别是什么的等等。。。一脸懵逼!!),幸好我还算幸运找到一份工作,下面是我总结的遇到的面试题:
1.字节对齐问题(几乎每家公司的面试题都会有),以下是我从网上抄的题还有字节对齐的一些概念。
首先一个重要的概念是为什么要字节对齐?(先要弄明白这个之前我是一点都不知道,有些时候都是蒙的不知道为啥是这个值)
(1)字节对齐的根本原因是CPU访问数据的效率问题,对于32位机器,4字节对齐就可以提高访问效率,如果double型是8字节超出了4字节边界存储,cpu就会读取两次,效率会变低,在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。
解这些题之前需要了解字节对齐的准则是什么(可自行百度一下字节对齐)
(1)结构体变量的首地址能被其最宽基本类型成员的大小所整除。
(2)结构体每个成员相对于结构体首地址的偏移量都是改成员大小的整数倍(如果不是的话编译器就会在成员间填充字节使之对齐)。
(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍。(如果不是的话编译器会在最后一个成员后面填充字节)。
struct Test
{
char t1;
double t2; //偏移量必须是它自己的整数倍,sizeof(double)为8,所以根据(2)准则,t1和t2之间要填充7个字节
int t3;//t3的偏移量是16字节,sizeof(int)为4,16是它的倍数,加起来总的字节数为1+7+8+4=20,根据(3)准则必须是8的倍数,所有t3后面需要在填充4个字节
};
综上sizeof(Test)=24;
如果是联合呢?看下面一个例子
typedef union
{
char a;
int b[5];
double c;
};
我们知道联合的大小是其最宽基本类型成员的大小,这里显然是数组最宽为20字节,那这个联合的大小是20吗?显然不是的,因为联合的大小除了是最宽基本类型的大小还应该是所有基本类型成员大小的倍数,所有需要在填充4个字节,因此这个联合的大小就是24。
联合还可以作为结构体的成员,这些题网上很多大家可以自己查找一下。
http://bbs.csdn.net/topics/360183704 这个博客大家也可以看一下对你面试肯定有帮助。
2.static全局变量和普通全局变量的区别?static局部变量和普通局部变量的区别?static函数和普通函数的区别?
(1)他们的区别在于作用域的不同,static全局变量的作用域只限于声明它的那个文件中,不加static修饰的全局变量通过extern在其他文件中也可以使用,它们的存储方式都是静态存储,
(2)static局部变量只初始化一次,下一次使用的值依赖上一次的值,static局部变量在程序结束时才被销毁,局部变量在在其作用域结束后就会被释放。
void fun()
{
int i = 0;
static int j = 1;
j++;
i++;
}
void main()
{
fun();//第一次调用i++但是i的作用域为fun函数内 当这个函数结束 i就会被释放了,但是j是静态变量,只用当main结束时才会被释放,j++后就是2,
fun();//再次调用你会发现i在++之前还是0,但是j就会是上次调用之后的值为2,
}
(3)static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
3.c++的静态成员变量和静态成员函数(会让你讲讲为什么用静态的,在哪里初始化)
http://blog.csdn.net/clc4210408/article/details/6775824#comments 大家可以仔细看一下这篇文章(里面有错误,仔细找找看呦!!)
http://c.biancheng.net/cpp/biancheng/view/209.html
大家记住静态只有一份,不管有多少个对象,静态成员变量和函数只用一份(普通的成员变量每个对象都会有一份并且大家互不影响),只要静态成员变量的值改变就会在所有对象中进行体现,
class Test
{
public:
int a;
static int b;
Test();
static int fun();
};
int Test::b=1;//初始化静态成员变量,在class的外部不会增加class的大小,不能加static
int Test::fun()
{
returen b;
//return a; 这个是错误的,因为静态成员函数只能访问静态成员变量!!!
}
Test::Test()
{
this->a = 0;
}
void main()
{
Test t1,t2;
t1.a = 1;//这时你会发现t2.a的值还是0并不会因为t1.a变成1了它也改变了
t1.b = 2;//这时你会发现t2.b怎么也变成2了,这就是静态造成,对象t1,t2所对的b其实是同一个
}