2017-03-04 4 views
1

여기 상황이 있습니다. 몇 가지 보호 된 데이터 멤버 및 몇 가지 공용 getter 함수 (한 줄 본문) 헤더 파일에서 선언 된 기본 클래스가 있습니다. 가상 메소드가 없습니다. 서브 클래스는 이것으로부터 파생 해, 그 정의가 대응하는 cpp 파일에 배치되는 그 자신의 생성자을 정의합니다.기본 클래스 본문 내부에서 선언되었지만 파생 클래스를 통해 호출되는 함수의 인라이닝

파생 클래스의 객체를 통해 getter 함수를 호출하는 것이 인라인됩니까?

편집 : 내 코드는 다음과 같습니다. 클래스 Quadrature2D의 객체에 의해 호출 될 때

// quad.h 
class QuadratureRule { 
protected: 
    int ngauss; 
    Array points; 
    Array weights; 
public: 
    QuadratureRule(int ng) : ngauss(ng) { } 
    double getweights(int ig) const { 
    return weights[ig]; 
    } 
}; 
class Quadrature2D : public QuadratureRule { 
public: 
    Quadrature2D(int ng); 
}; 

그리고

//quad.cpp 
#include "quad.h" 
Quadrature2D::Quadrature2D(int ng) : QuadratureRule(ng) { 
    // initialize arrays in a certain way 
} 

나는 인라인 getweights를 원한다. 또한 GCC g ++ 5.4 및 6.3을 사용하고 있습니다.

+2

질문이 명확 할 수도 있지만 코드는 볼륨을 말해줍니다. 코드 데모를 제공 할 수 있습니까? – WhiZTiM

+3

아마도 그렇습니다. 확실한 유일한 방법은 생성 된 코드를 검사하는 것입니다. (C++이 함수 인라이닝을 필요로하는 경우는 없으며, 구현에 달려 있습니다.) – molbdnilo

+0

코드를 인라인해서는 안되는 이유는 없습니다.이 점에있어서 여러분의 상황은 다른 함수에 비해 특별한 것이 아닙니다. 그러나 그럼에도 불구하고 함수가 인라인 될 것이라는 보장은 없습니다. 조립품을 확인하십시오. – overseas

답변

0

편집 :

좀 더 그것을 확인 봤는데 당신이 최적화를 켤 경우 실제로 인라인 될 것으로 보인다. 그러나 사람들이 이미 의견에 언급했듯이 실제로 구현에 의존합니다. 예 :

Code without optimizations

Code with optimizations


당신은 내가 그것을 확인 날 호기심 얻었다.

// base.h 
include <iostream> 

class Base { 
    int x; 
    int y; 
public: 
    Base(int x = 0, int y = 0) : x(x), y(y) {} 
    int getx() const { return x; } 
    void setx(int x) { this->x = x; } 
    int gety() const { return y; } 
    void sety(int y) { this->y = y; } 
}; 

그리고 :

// derived.cpp 
#include "base.h" 

class Derived : public Base { 
    int z; 
public: 
    Derived(int x = 0, int y = 0, int z = 0) : Base(x, y), z(z) {} 
}; 

using namespace std; 

int main() { 
    Derived d(1, 2, 3); 
    cout << "d.x == " << d.getx() << ", d.y == " << d.gety() << endl; 
    d.setx(4); 
    d.sety(4); 
    cout << "d.x == " << d.getx() << ", d.y == " << d.gety() << endl; 
    return 0; 
} 

과 함께 GCC 6.3에 컴파일 : 여기

g++ -Wall -Werror -g -pedantic-errors -o derived derived.cpp 

은 objdump를의 일부, main() 내부 :

a2b: e8 1a 01 00 00   call b4a <_ZN4Base4setxEi> ; A call to setx() 
a30: 48 8d 45 e0    lea rax,[rbp-0x20] 
a34: be 04 00 00 00   mov esi,0x4 
a39: 48 89 c7    mov rdi,rax 
a3c: e8 33 01 00 00   call b74 <_ZN4Base4setyEi> ; A call to sety() 
a41: 48 8d 45 e0    lea rax,[rbp-0x20] 
a45: 48 89 c7    mov rdi,rax 
a48: e8 15 01 00 00   call b62 <_ZNK4Base4getyEv> ; A call to gety() 
a4d: 89 c3     mov ebx,eax 
a4f: 48 8d 45 e0    lea rax,[rbp-0x20] 
a53: 48 89 c7    mov rdi,rax 
a56: e8 df 00 00 00   call b3a <_ZNK4Base4getxEv> ; A call to getx() 
이 내 프로그램입니다

중요한 것을 간과하지 않았다고 가정하면 코드를 인라인 할 수 없다고 생각합니다.