インライン関数宣言した場合
コンパイル時に式が展開されますが、
下記のようにadd()の引数にどのxが入るかわからない以上安易に展開できないと思いました。
こういった場合のインライン関数の処理として、内部的にはどうなっているのでしょうか?
C++
1 2class XXX 3{ 4publc: 5 int x; 6 inline int GetX()const{return x;} 7} 8 9int add(XXX& hoge) 10{ 11 return hoge.GetX() + 100; 12} 13 14
どのあたりを疑問に感じているのでしょうか.あくまでイメージですが以下のように展開できそうに思えませんか?
```
int add(XXX& x)
{
return x.x + 100;
}
```
すいません xはprivateにするべきでした
あと引数xと変数xがかぶっていてみにくいので修正します
コンパイラがprivateを律儀に守る必要はないので、privateにしても関係ないかと
前提として、言語仕様上は見かけ上の理屈が守られていればどのようにコンパイルされてもよいことになっています。 プログラムの字面上では private にアクセスできませんが、生成される機械語ではアクセスされることもあります。
自分としてはinlineの置き換える(展開する) = 数字・文字とだけ認識していました
(#defineみたいに)
下記のようになるということを踏まえてもう一度考えてみて
まとまり次第解決方法を書きたいと思います。
ありがとうございました。
int add(XXX& x)
{
return x.x + 100;
}
質問の内容とは直接の関係はありませんが補足として。
クラス定義の中でメンバ関数の定義も書いた場合には inline を付けなくても inline を指定しているものとみなすという規則です。 つまり、質問文中のコードは inline と明示する必要はありません。
C++ の原則として「同じ内容の宣言はいくつあってもよいが定義は全体でひとつ」という規則 (One Definition Rule) があり、しかし inline 指定されたものはその例外とするという規則になっています。
現代の C++ コンパイラはインライン化すべきかどうかは賢い最適化機構が判断しますので、 inline 指定は One Definition Rule の例外とするという意味で使います。 指定をヒントとして多少は考慮するかもしれませんが inline 指定を付けたからと言ってインライン化するとは限りませんし、付けてなくてもインライン化されることも普通にあります。
回答1件
あなたの回答
tips
プレビュー