2017-03-04 5 views
1

ここには状況があります。私はいくつかの保護されたデータメンバーといくつかのパブリックゲッター関数(1行の本体)を持つヘッダーファイルで宣言された基本クラスを持っています。仮想メソッドはありません。サブクラスはそれから派生し、独自のコンストラクタを定義します。そのコンストラクタの定義は、対応するcppファイルに配置されます。基本クラス本体の中で宣言されているが派生クラスを通して呼び出された関数のインライン化

派生クラスのオブジェクトを通してゲッター関数への呼び出しをインライン化できますか?

編集:ここに私のコードです。

// 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 
} 

私はクラスQuadrature2Dのオブジェクトによって呼び出されたときgetweightsをインライン化します。 また、私はGCC g ++ 5.4と6.3を使用しています。

+2

あなたの質問は明らかかもしれませんが、コードはボリュームを話します。コードデモンストレーションを提供できますか? – WhiZTiM

+3

おそらく、そうです。確かめる唯一の方法は、生成されたコードを調べることです。 (C++に関数のインライン展開が必要なケースはありません;実装次第です) – molbdnilo

+0

コードをインライン化してはならない理由はありません。この点に関して、あなたの状況は他の関数に比べて特別なものではありません。しかし、それでも関数がインライン化される保証はありません。あなたのアセンブリを確認してください。 – overseas

答えて

0

EDIT:

私はもっとそれをチェックしてきたし、あなたが最適化をオンにした場合、それは実際にインライン化されるようです。しかし、すでにコメントに記載されているように、実際は実装に依存しています。例:

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; } 
}; 

そして:

とGCC 6.3でコンパイル
// 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; 
} 

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

ここmain()内、objdumpのの一部です:

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() 

私は何か重要なことを見落とさなかったと仮定すると、コードをインライン化することを信用できないと思います。

関連する問題