最近在找新的工作,在找工作中遇到很多面試題,大多數讓我很難堪,再次讓我認識到自己的知識的匮乏,上份工作是以應屆生的身份,所有當時進項目組也沒有很多要求,進入項目組後自己還算好學(自己以為),之前也沒有相關的經驗,自己很自信(其實都是盲目的),在上份工作中遇到幾個願意帶我的老員工對我幫助很大(也間接的造成自己很自大),上份工作主要使用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其實是同一個
}