Intro
關於vector 與 memory 使用注意事項Content
---非指標泛型
#include "stdafx.h" #include <vector> #include <string> class Node { public: std::string name; int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,x,y,z; }; int _tmain(int argc, _TCHAR* argv[]) { std::vector<Node> v; for(int i=0; i<10000; i++) { v.push_back(Node()); } //v.clear();//#1 //std::vector<Node>().swap(v);//#2 printf("pls press any key..."); getchar(); return 0; }
上面程式在 getchar() 停下來時, memory 3164k
註解#1拿掉, memory 2704k
註解#2拿掉, memory 1128k
所以要連同 vector 本身所指的 ptr 也清掉才算真的清掉(詳請找google大神)
---指標泛型
int _tmain(int argc, _TCHAR* argv[]) { std::vector<Node*> v; for(int i=0; i<10000; i++) { v.push_back(new Node()); } //v.clear();//#1 //std::vector<Node*>().swap(v);//#2 printf("pls press any key..."); getchar(); return 0; }上面程式在 getchar() 停下來時, memory 3276k
大於非指標泛型, 原因在它除了要配置 class Node 的記憶體外,
還要配置 指標 指向該結構
拿掉註解 #1 和 #2, memory 3228k
僅只是把vector指標給清空
要自己釋放 new 出來的 memory
---vector<非指標型別> 在 class 裡
class NodeGroup { public: void clear() { nodes.clear(); std::vector<Node>().swap(nodes); } std::string name; std::vector<Node> nodes; }; int _tmain(int argc, _TCHAR* argv[]) { NodeGroup *group = new NodeGroup(); for(int i=0; i<10000; i++) { group->nodes.push_back(Node()); } //group->clear(); //#1 delete group; //#2 printf("pls press any key..."); getchar(); return 0; }若沒有 #2 delete 的話, memory 3172k
有 #2, memory 1192k
將 #1 拿掉後, memory 1128k
所以一樣不用顧慮vector裡的各元素
僅在 deconstructor 去清掉 vector 就好
---比較
♦ 指標型的 vector 僅操作指標, 配置和操作都比較快
♦ 非指標型的, 在使用 assign 的 operator= 時, 將複製整個結構
e.g.
int _tmain(int argc, _TCHAR* argv[]) { std::vector<Node> v; for(int i=0; i<10000; i++) { v.push_back(Node()); } v[0].name = "node1"; Node node = v[0]; node.name = "node2"; printf("%s = %s\n", v[0].name.c_str(), node.name.c_str()); // result: node1 = node2 v.clear(); std::vector<Node>().swap(v); printf("pls press any key..."); getchar(); return 0; }♦ 非指標型的, 不需寫額外的代碼去 free 指標型結構的memory
沒有留言:
張貼留言