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
沒有留言:
張貼留言