某廠幾道C/C++面試題

說來慚愧,時間緊急,沒有準備,唉,自作孽……


1. 如何快速判斷一個unsigned int是不是2的n次方

最快解法思路: return a&(a-1)


2. 給定結構體中一個成員的地址,求結構體的首地址

這是Linux內核代碼中用的一個函數或者說方法,之前從未接觸過,所有有點懵逼…..

具體定義如下:
#define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

一點點來看:

  • (type *)0:就是將地址0開始的地方轉化爲一個type類型的指針

  • &((type *)0)->member:取member成員的地址

    • 這個因爲從0地址開始,所以這個地址就是member成員的偏移量
  • (unsigned long):強制轉換

  • (type *)((char *)(ptr):這個ptr就是結構體成員的地址,用這個地址減去member的偏移量,就是結構體的首地址了


3. vector中erase的實現(不用寫重載,隨便實現一個)


  • 對於vector容器,因爲是類似數組連續內存的存放方式,所以刪除一個元素只能一個個往前挪

爲了支持快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨着前一個元素存儲。

iterator erase(iterator _p) {
    copy(_p + 1, end(), _p);
    _Desotry(_Last - 1, _Last);
    --_Last;
    return(_p);
  • vector的內存管理遵循只增不減的原則,所以資源不會被釋放,只是end指針向前移動了,利用iterator不能訪問原vector中最後一位了,但是[]可以強制訪問。

    • 由於vector的內存佔用空間只增不減,比如你首先分配了10,000個字節,然後erase掉後面9,999個,留下一個有效元素,但是內存佔用仍爲10,000個。

    • 所有內存空間是在vector析構時候才能被系統回收。

    • size()成員指當前擁有的元素個數;

    • capacity()成員指當前(容器必須分配新存儲空間之前)可以存儲的元素個數。

    • reserve()成員可以用來控制容器的預留空間。

  • vector另外一個特性在於它的內存空間會自增長,每當vector容器不得不分配新的存儲空間時,會以加倍當前容量的分配策略實現重新分配。例如,當前capacity爲50,當添加第51個元素時,預留空間不夠用了,vector容器會重新分配大小爲100的內存空間,作爲新連續存儲的位置。

    • 如果實現push_back, 則必須考慮當前容器的capacity是否需要擴充。




總結

題目不難,平時多積累!努力成就夢想,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章