【发布时间】:2010-06-18 12:39:49
【问题描述】:
根据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++这个虚函数和每个子类的实现都是纯的?
【问题讨论】:
-
我注意到 __attribute__((nothrow)) 的行为方式也相同。
标签: c++ optimization g++ virtual-functions