g********E 发帖数: 178 | 1 关于占用资源的,比如在一个for loop里,需要用vector存暂时的数据。下面哪种方法
更省资源呢?
1,在外面定义vector,在for loop里每次iteration完了后用pop_back清空vector元素
,再接着使用
2,在for loop里,每次iteration新定义一个vector,iteration完了后vector会被自动
清除,下一次再建一个新的用。
不知道系统删除变量具体都有些什么操作,还有新建变量,这样加起来会比我只删除里
面的元素快吗? |
d**********x 发帖数: 4083 | 2 如果你在for loop里面定义,那个vector会不断析构。
谁教你用pop_back的。。= =
用clear,亲
【在 g********E 的大作中提到】 : 关于占用资源的,比如在一个for loop里,需要用vector存暂时的数据。下面哪种方法 : 更省资源呢? : 1,在外面定义vector,在for loop里每次iteration完了后用pop_back清空vector元素 : ,再接着使用 : 2,在for loop里,每次iteration新定义一个vector,iteration完了后vector会被自动 : 清除,下一次再建一个新的用。 : 不知道系统删除变量具体都有些什么操作,还有新建变量,这样加起来会比我只删除里 : 面的元素快吗?
|
g********E 发帖数: 178 | 3 Thank you dear!但是什么叫vector会不断析构呢?
我的元素不是一次删完的,不过clear我真是没用过,谢谢提点啊,另外还想问,除了
看着难看,一个一个pop_back会比clear慢吗?I guess just function call overhead?
【在 d**********x 的大作中提到】 : 如果你在for loop里面定义,那个vector会不断析构。 : 谁教你用pop_back的。。= = : 用clear,亲
|
d**********x 发帖数: 4083 | 4 如果你不是一次删完的话,但是要从尾部删,直接resize即可,循环和function call
都是有cost的,而且写着也麻烦不是
其实clear和直接析构的差别在于vector本身是否需要析构,大头在哪边要看你的元素
有没有析构的cost
overhead?
【在 g********E 的大作中提到】 : Thank you dear!但是什么叫vector会不断析构呢? : 我的元素不是一次删完的,不过clear我真是没用过,谢谢提点啊,另外还想问,除了 : 看着难看,一个一个pop_back会比clear慢吗?I guess just function call overhead?
|
g********E 发帖数: 178 | 5 查了下原来析构是destruct,明白了,如果我就用默认的,
This destroys all container elements, and deallocates all the storage
capacity allocated by the vector using its allocator.
这样是不是析构就不如clear/resize快?
resize不错,非常符合我的需要:)
call
【在 d**********x 的大作中提到】 : 如果你不是一次删完的话,但是要从尾部删,直接resize即可,循环和function call : 都是有cost的,而且写着也麻烦不是 : 其实clear和直接析构的差别在于vector本身是否需要析构,大头在哪边要看你的元素 : 有没有析构的cost : : overhead?
|
d**********x 发帖数: 4083 | 6 恩,destruct的时候有两部分cost
1是vector本身的内存
2是各个元素的destruct
如果元素都是int啊char之类的,那大头基本在vector那边,用resize好了
【在 g********E 的大作中提到】 : 查了下原来析构是destruct,明白了,如果我就用默认的, : This destroys all container elements, and deallocates all the storage : capacity allocated by the vector using its allocator. : 这样是不是析构就不如clear/resize快? : resize不错,非常符合我的需要:) : : call
|
g********E 发帖数: 178 | 7 明白啦,多谢传道授业解惑,可惜没有包子给你:)
【在 d**********x 的大作中提到】 : 恩,destruct的时候有两部分cost : 1是vector本身的内存 : 2是各个元素的destruct : 如果元素都是int啊char之类的,那大头基本在vector那边,用resize好了
|
n**m 发帖数: 122 | 8 我帮你看了一下 包子好像还不少呢 lol
【在 g********E 的大作中提到】 : 明白啦,多谢传道授业解惑,可惜没有包子给你:)
|
d**********x 发帖数: 4083 | 9 = =
要啥包子,我已经够胖了
【在 g********E 的大作中提到】 : 明白啦,多谢传道授业解惑,可惜没有包子给你:)
|
g********E 发帖数: 178 | 10 ft,我这是老ID新上线,哪儿来的包子。。。
【在 n**m 的大作中提到】 : 我帮你看了一下 包子好像还不少呢 lol
|
b******7 发帖数: 92 | 11 vector的大概的实现(省略很多细节)。
如果在for循环里面定义vector,则会调用构造和析构函数,导致elem不断的new和
delete
而如果在外面定义,则只会调用vector的构造和析构一次,即一次new和delete
template
class vector{
public:
vector(size_t n){capacity = n;elem = new T[capacity];size=0;}
~vector(){delete [] elem;}
void clear(){size=0;}
....
....
private:
T * elem;
int capacity;
int size;
....
};
【在 g********E 的大作中提到】 : 关于占用资源的,比如在一个for loop里,需要用vector存暂时的数据。下面哪种方法 : 更省资源呢? : 1,在外面定义vector,在for loop里每次iteration完了后用pop_back清空vector元素 : ,再接着使用 : 2,在for loop里,每次iteration新定义一个vector,iteration完了后vector会被自动 : 清除,下一次再建一个新的用。 : 不知道系统删除变量具体都有些什么操作,还有新建变量,这样加起来会比我只删除里 : 面的元素快吗?
|
r*******e 发帖数: 7583 | 12 看过某公司的coding guidance
有一点就是尽量不要在loop里面创建复杂变量,连string都最好重复利用
【在 g********E 的大作中提到】 : 关于占用资源的,比如在一个for loop里,需要用vector存暂时的数据。下面哪种方法 : 更省资源呢? : 1,在外面定义vector,在for loop里每次iteration完了后用pop_back清空vector元素 : ,再接着使用 : 2,在for loop里,每次iteration新定义一个vector,iteration完了后vector会被自动 : 清除,下一次再建一个新的用。 : 不知道系统删除变量具体都有些什么操作,还有新建变量,这样加起来会比我只删除里 : 面的元素快吗?
|
f********4 发帖数: 988 | 13 如果是简单类型
int char
就不调用析构函数了是嘛。。。
我随便问一下,还是分情况,在编译器优化OR不优化分情况讨论? |
d**********x 发帖数: 4083 | 14 我直觉上觉得这种层次的东西编译器很难优化,因为析构的副作用编译器不能预知
是不是这样。。可以g++ -O2 -S看一下汇编,我就不动手了。。
【在 f********4 的大作中提到】 : 如果是简单类型 : int char : 就不调用析构函数了是嘛。。。 : 我随便问一下,还是分情况,在编译器优化OR不优化分情况讨论?
|