为什么g ++不关注虚拟函数的__attribute __((pure))?

时间:2010-06-18 12:39:50

标签: c++ optimization g++ virtual-functions

根据the GCC documentation__attribute__((pure))告诉编译器一个函数没有副作用,因此它可以进行常见的子表达式消除。

此属性似乎适用于非虚函数,但不适用于虚函数。例如,请考虑以下代码:

extern void f( int );

class C {
 public:
   int a1();
   int a2() __attribute__((pure));
   virtual int b1();
   virtual int b2() __attribute__((pure));
};

void test_a1( C *c ) {
   if( c->a1() ) {
      f( c->a1() );
   }
}

void test_a2( C *c ) {
   if( c->a2() ) {
      f( c->a2() );
   }
}

void test_b1( C *c ) {
   if( c->b1() ) {
      f( c->b1() );
   }
}

void test_b2( C *c ) {
   if( c->b2() ) {
      f( c->b2() );
   }
}

在启用优化(-O2或-Os)的情况下编译时,test_a2()仅调用C::a2()一次,但test_b2()调用b2()两次。

这有什么理由吗?是因为,即使类C中的实现是纯粹的,g ++也不能假设每个子类中的实现也是纯粹的吗?如果是这样,有没有办法告诉g ++这个虚函数和每个子类的实现都是纯粹的?

1 个答案:

答案 0 :(得分:3)

不考虑g ++的内部结构,我怀疑这是因为g ++不能假设每个子类的实现都是纯粹的(就像你说的那样)。

你可以将b2变成虚拟非纯方法的非虚拟纯包装吗?