質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

955閲覧

インライン関数について

apa

総合スコア68

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/10/03 05:45

編集2021/10/03 06:43

インライン関数宣言した場合
コンパイル時に式が展開されますが、
下記のように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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/03 06:29

どのあたりを疑問に感じているのでしょうか.あくまでイメージですが以下のように展開できそうに思えませんか? ``` int add(XXX& x) { return x.x + 100; } ```
apa

2021/10/03 06:42

すいません xはprivateにするべきでした あと引数xと変数xがかぶっていてみにくいので修正します
退会済みユーザー

退会済みユーザー

2021/10/03 06:55

コンパイラがprivateを律儀に守る必要はないので、privateにしても関係ないかと
SaitoAtsushi

2021/10/03 07:08

前提として、言語仕様上は見かけ上の理屈が守られていればどのようにコンパイルされてもよいことになっています。 プログラムの字面上では private にアクセスできませんが、生成される機械語ではアクセスされることもあります。
apa

2021/10/03 07:16

自分としてはinlineの置き換える(展開する) = 数字・文字とだけ認識していました (#defineみたいに) 下記のようになるということを踏まえてもう一度考えてみて まとまり次第解決方法を書きたいと思います。 ありがとうございました。 int add(XXX& x) { return x.x + 100; }
SaitoAtsushi

2021/10/03 07:40

質問の内容とは直接の関係はありませんが補足として。 クラス定義の中でメンバ関数の定義も書いた場合には inline を付けなくても inline を指定しているものとみなすという規則です。 つまり、質問文中のコードは inline と明示する必要はありません。 C++ の原則として「同じ内容の宣言はいくつあってもよいが定義は全体でひとつ」という規則 (One Definition Rule) があり、しかし inline 指定されたものはその例外とするという規則になっています。 現代の C++ コンパイラはインライン化すべきかどうかは賢い最適化機構が判断しますので、 inline 指定は One Definition Rule の例外とするという意味で使います。 指定をヒントとして多少は考慮するかもしれませんが inline 指定を付けたからと言ってインライン化するとは限りませんし、付けてなくてもインライン化されることも普通にあります。
guest

回答1

0

ベストアンサー

イメージ説明code

まあ、コンパイラの最適化というのはいろいろできるのでaddの関数定義こそ残っているものの呼び出しはせず、いきなり即値を出力しようとしていました。まあコンパイラによるinline展開のイメージを持ってもらえたでしょうか・・・?

なおC++という言語から見たとき、inlineキーワードはインライン展開を指示しません。単にODRルールのために存在します。

投稿2021/10/03 15:25

編集2021/10/03 15:26
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問