C++ 为什么';t g++;注意虚函数的_属性_((纯))吗?

C++ 为什么';t g++;注意虚函数的_属性_((纯))吗?,c++,optimization,g++,virtual-functions,C++,Optimization,G++,Virtual Functions,根据,\uuuuuu属性(pure))告诉编译器函数没有副作用,因此它可以接受公共子表达式消除 此属性似乎适用于非虚拟函数,但不适用于虚拟函数。例如,考虑下面的代码: extern void f( int ); class C { public: int a1(); int a2() __attribute__((pure)); virtual int b1(); virtual int b2() __attribute__((pure)); }; void tes

根据,
\uuuuuu属性(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++这个虚拟函数和每个子类的实现都是纯的?

如果不研究g++的内部,我怀疑这是因为g++不能假设每个子类的实现都是纯的(就像你说的)


能否将
b2
转换为虚拟非纯方法的非虚拟纯包装器?

我注意到uu属性uu((nothrow))也有相同的行为。谢谢,这是一个有趣的想法。