根据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 ++这个虚函数和每个子类的实现都是纯粹的?
答案 0 :(得分:3)
不考虑g ++的内部结构,我怀疑这是因为g ++不能假设每个子类的实现都是纯粹的(就像你说的那样)。
你可以将b2
变成虚拟非纯方法的非虚拟纯包装吗?