代码之家  ›  专栏  ›  技术社区  ›  jchl

为什么G++不注意虚拟函数的属性?

  •  2
  • jchl  · 技术社区  · 14 年前

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

    1 回复  |  直到 11 年前
        1
  •  3
  •   Josh Kelley    14 年前

    如果不研究g++的内部结构,我怀疑这是因为g++不能假定每个子类的实现都是纯的(如您所说)。

    你能转身吗? b2 在虚拟非纯方法的非虚拟纯包装中?