vector notes
struct _Vector_base
{
public:
????? _Vector_impl _M_impl;
};
?
struct _Vector_impl : public _Tp_alloc_type???????? _Vector_impl類時(shí)從alloc繼承的
?
class vector : protected _Vector_base<_Tp, _Alloc>?? vector從base類繼承。
?
vector向外提供的接口push_back' pop等都沒(méi)有直接調(diào)用new/delete, 而是調(diào)用allocator的allocate, deallocate
?
allocator沒(méi)有靜態(tài)函數(shù)和成員
?
因此每個(gè)vector都是有自己的緩存; 內(nèi)部申請(qǐng)內(nèi)存效率很高(完全無(wú)互斥)
?
如果自己維護(hù)全局內(nèi)存, 有幾十個(gè)線程要同時(shí)申請(qǐng)內(nèi)存, 需要很嚴(yán)重的互斥。
?
stl的容器都是值容器, 一般對(duì)象不太大時(shí), 直接放入對(duì)象比較好。 可以搜搜為啥不放指針
?
vector的內(nèi)存一般是2倍動(dòng)態(tài)增長(zhǎng)。 假設(shè)vector只能放10個(gè)元素, 第11個(gè)放不進(jìn)去,此時(shí)會(huì)申請(qǐng)20個(gè)元素空間, 把此前的10個(gè)拷過(guò)去、再放入第11個(gè)
所以vector初始時(shí)調(diào)用reserve預(yù)分配空間性能比較好, 如果50%的用戶30個(gè)節(jié)點(diǎn)已經(jīng)足夠, 可以reserve(30個(gè)節(jié)點(diǎn)), 此時(shí)的插入刪除操作完全不需再向os申請(qǐng)內(nèi)存
1) 可能會(huì)有碎片, 連接google的tcmalloc就可以了。 完全不用修改代碼
2) 可能會(huì)有一定的內(nèi)存浪費(fèi); 如果內(nèi)存不是太緊張,也沒(méi)關(guān)系
?
?
節(jié)點(diǎn)大小32字節(jié), 最多200個(gè)節(jié)點(diǎn), 100w個(gè)user, 總共需要內(nèi)存 5G
最多200個(gè)節(jié)點(diǎn), 夠95%的用戶使用了; 要求再多時(shí)就換入換出吧, 類似進(jìn)程只有2G內(nèi)存, 再多就換入換出一樣
如果要把用戶所有內(nèi)容裝進(jìn)來(lái), 浪費(fèi)、太不可控、會(huì)有性能問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的vector notes的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: memcache nginx
- 下一篇: valgrind