list<mpz_class> baseFactor;
1)
int *tab = new int [baseFactor.size()]; //baseFactor.size() ~= 20000
for(i = 0; i < baseFactor.size(); i++){
cout << tab[i] << endl;
}
// Total time: 2.620790
2)
int size = baseFactor.size();
int *tab = new int [size]; //baseFactor.size() ~= 20000
for(i = 0; i < size; i++){
cout << tab[i] << endl;
}
//Total time: 0.366500
为什么g ++编译器没有在2)中优化代码1)?
答案 0 :(得分:5)
根据baseFactor
的定义位置(全局变量?),编译器很难证明size()
总是返回相同的值。
如果无法证明,则无法将呼叫移出循环。
答案 1 :(得分:2)
对于要优化到第二个的第一个,它将要求baseFactor.size()在循环期间永远不会改变。
当然它可能没有,但编译器知道吗?
答案 2 :(得分:1)
std::list
container是链表,计算其大小可能代价高昂(O(n)算法,在最新的C ++ 11标准IIRC中已经改变)。编译器不知道你的函数体没有改变basefactor
,因此它的大小在第一种情况下的每个循环中计算一次(在for
循环的每次测试中)并且只在第二个。
也许你应该考虑改用std::vector
。