今天去腾讯面试,本以为面试者会问很深的问题,结果答了份卷子,很基础,但是自己很多东西愣是忘了,这里mark一下!
一、字节对齐
字节对齐的原因,是机器在存取内存中保存的数据的高效性。通常机器是机器位数为自然边界来访问内存的,如果一个4字节整形数,所在的内存不在虚拟内存的自然边界。则CPU需要读多于一次的数据,这样就降低了效率。
所以,简单地说,就是保证CPU指令在访问数据的时候,能一次读取,而不需要跨越内存的自然边界。32位系统默认4字节对齐。当然可以通过#pragma pack(1)将内存改为1字节对齐,用#pragma pack()恢复默认的字节对齐。
二、常数0转化为指针
(int) ((int*)0+4) 主要是被(int*)0给搞晕了,平时用的都是char *p; int *q; q=(int*)p; 这里需要说明的是,0是常量,(int*)0表示的是一个指针,指针指向0内存地址,指针的步长为sizeof(int)。类似这种: int a ; (char*)a:表示的是一个char*的指针,指针的值是int型变量a指向的值。所以,((int*)0+4)表示的是指向值为16的内存地址。转为为int型,自然也是16
三、内联函数的本质
四、二分查找
两次倒在二分查找。主要是没有考虑边界问题。回来实现了下:
int main()
{
int low =0, middle =0, high=9;
int narray[10]={1,7,9,15,23,45,52,65,65,69};
int