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))也有相同的行为。谢谢,这是一个有趣的想法。