g ++编译器优化

时间:2012-01-17 10:02:53

标签: c++ optimization g++

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)?

3 个答案:

答案 0 :(得分:5)

根据baseFactor的定义位置(全局变量?),编译器很难证明size()总是返回相同的值。

如果无法证明,则无法将呼叫移出循环。

答案 1 :(得分:2)

对于要优化到第二个的第一个,它将要求baseFactor.size()在循环期间永远不会改变。

当然它可能没有,但编译器知道吗?

答案 2 :(得分:1)

std::list container是链表,计算其大小可能代价高昂(O(n)算法,在最新的C ++ 11标准IIRC中已经改变)。编译器不知道你的函数体没有改变basefactor,因此它的大小在第一种情况下的每个循环中计算一次(在for循环的每次测试中)并且只在第二个。

也许你应该考虑改用std::vector