2017-03-04 76 views
1

以下是情況。我在頭文件中聲明瞭一個基類,其中包含一些受保護的數據成員和一些公共getter函數(單行主體)。沒有虛擬方法。一個子類是從它派生出來的,並定義了它自己的構造函數,其定義放置在相應的cpp文件中。內聯基類內部聲明但通過派生類調用的函數

將內聯的派生類的對象調用到getter函數?

編輯:這是我的代碼。

// 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內聯時Quadrature2D類的對象調用。 另外,我正在使用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() 

假設我沒有忽略任何重要的東西,我想你不能相信你的代碼被內聯。