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