阿里筆試題2017重點


c++相關:對c++不是很了解,雖然學過,但是學得不是很好,使用更是很少。

1.inline函數

基本的形式:

inline int min(int first, int second)
   

 

關鍵字inline要與函數的定義放在一起才能成為內聯函數:

函數的聲明和定義的區別:

inline void Foo(int x);

  

inline void Foo(int x){
  ....

}

inline是"用於實現的關鍵字",不是用於生成的關鍵字。聲明相當於對外接口,調用者並不需要了解,是否是內聯實現。

定義在類中的成員函數自動成為內聯函數。

 

class A
{
    public:
    void Foo(int x, int y)//自動地成為內聯函數
    { 
          .......
    }
};

如果內聯函數中的代碼過長或者有循環,那么不推薦是用內聯函數。

使用內聯函數的關鍵字不一定會在編譯器中展開,編譯器是有選擇性的。

頭文件中包含的inline函數的定義而非聲明。

不可以不同的源文件中定義函數名相同但實現不同的inline函數,會發生沖突。

內聯函數機制既具備宏代碼的效率,又增加了安全性,並且可以自由的操作類中的數據成員。

宏代碼的機制:#define 本身不是函數,但是使用起來像函數。編譯預處理器用拷貝宏代碼的方式取代函數調用,省去參數壓棧,call調用,返回參數,return過程,提高了速度。但是容易出錯,拷貝宏代碼時會產生邊際效應。不可以調試。無法操作私有數據成員。assert除外,用於宏定義,不是函數。

內聯函數可以調試:在debug版本中沒有真正內聯,像普通函數一樣,release版本中才會真正內聯。

 

 

數據結構:

1.進制問題  一些概念理解不清

n位的2進制:

2^(n-1)*(an)+2^(n-2)*an-1+.....2^(0)*(a0)

問題:

假設在n進制下,下面的等式成立,n值是()240*12=2880

解答:
(2*(n^2)+4*(n^1)+0*1)*(1*(n^1)+2*(n^0))=2*(n^3)+8*(n^2)+8*(n^1)+0
等式恆成立,所以結果是任意進制

 

2.線性表

循環鏈表是另一種形式的鏈式存儲結構。將鏈表中最后一個指針域從null改變為開始節點。

隊列是只允許在一端插入另一端刪除的鏈式結構。

棧是在棧頂進行插入,刪除的鏈式結構。

“關聯數組”是一種具有特殊索引方式的數組。不僅可以通過整數來索引它,還可以使用字符串或者其他類型的值(除了NULL)來索引它。不是線性表。

 

3.struct類型的大小:

64位處理器中:指針為8個字節,int是4個字節,char是1個字節,總共13字節,但是struct必須是8的整數倍,所以16個字節。

 

4.iterator.erase()方法

是刪除當前的字符,指針指向下一個字符。

#include <iostream>       
#include <vector>
using namespace std;
int main(void)
{
    vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    vector<int>::iterator itor;
    for(itor=array.begin();itor!=array.end();itor++)
    {
        if(*itor==300)
        {
            itor=array.erase(itor);
        }
    }
    for(itor=array.begin();itor!=array.end();itor++)
    {
            cout<<*itor<<"";
    }
  return 0;
}

答案為:

100 300 300 500

 

5.

c錯誤原因:類的常量才是不可修改。

關於靜態成員的特性可參考借鑒另一個博客:http://www.cnblogs.com/morewindows/archive/2011/08/26/2154198.html謝謝。

linux:

linux是一點都不了解的。

1.linux多路復用I/O接口select和epoll來實現高並發

區別:select輪詢方式,效率低,epoll是觸發式的,效率較高

1:select中socket的數量是有限制的,由FD_SETSIZE決定一般是1024.通過遍歷FD_SETSIZE1024個socket來決定調度哪個socket,不管是否活躍都會全部遍歷一次。

2.epoll無限制,是觸發式的,當有socket事活躍態的時候則callback,若所有的都是活躍態則回到了遍歷方式。

socket數量限制問題的解決:

1.修改FD_SETSIZE定義的宏,重新編譯進內核,但是這會導致網絡質量的下降。

2.實現多進程。

epoll不會IO效率不隨FD數目增加而線性下降

Select會

epoll的適用情景就是大量的socket,但是活躍多不是很高的情況。epoll通過共享存儲實現內核和用戶的數據交互。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM