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