網頁

2014年4月19日 星期六

C++ vector 與 memory

Last Update: 2014/04/20 13:29+08


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



沒有留言:

張貼留言