回答編集履歴

2

インライン関数とODRの関係を追記

2015/06/09 12:57

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- // OK: クラス定義内でメンバ関数を定義した場合、暗黙にinline関数となる
37
+ // OK: クラス定義内でメンバ関数を定義した場合、暗黙にインライン関数となる
38
38
 
39
39
  int getM3() {
40
40
 
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- // OK: クラス定義外で明示的にinlineキーワード指定すればinline関数となる
49
+ // OK: クラス定義外で明示的にinlineキーワード指定すればインライン関数となる
50
50
 
51
51
  inline int Foo::getM1() {
52
52
 
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- // NG:クラス定義外でinlineキーワードがなければ非inline関数となる
59
+ // NG:クラス定義外でinlineキーワードがなければ非インライン関数となる
60
60
 
61
61
  int Foo::getM2() {
62
62
 
@@ -65,3 +65,7 @@
65
65
  }
66
66
 
67
67
  ```
68
+
69
+
70
+
71
+ ちなみに、ODR違反になるか否かは「インライン関数として**扱われるか**」という観点のみが関与します。インライン関数が**実際に**インライン展開されるかどうかは、ODRの議論とは無関係です。`inline`キーワードはコンパイラへの**最適化ヒント情報**という側面ももり、こちらは単にコンパイラによる最適化性能の話です。最近のまともなコンパイラであれば、非インライン関数であってもインライン展開を行ったり、インライン関数であっても通常の関数呼び出しになったりします。

1

inline関数となるパターンを例示

2015/06/09 12:57

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -10,4 +10,58 @@
10
10
 
11
11
 
12
12
 
13
- このルールの例外として、テンプレート(`template`)定義や、インライン関数(`inline`)定義はヘッダファイルに書いてもOKです。
13
+ このルールの例外として、テンプレート(`template`)定義や、インライン関数(`inline`)定義はヘッダファイルに書いてもOKです。何がインライン関数となるかについては、少々ややこしいルールがあるので下記も参考にしてください。
14
+
15
+
16
+
17
+ ```lang-cpp:
18
+
19
+ // (複数cppファイルからincludeされるヘッダファイルと仮定)
20
+
21
+
22
+
23
+ class Foo {
24
+
25
+ int m1, m2, m3;
26
+
27
+ public:
28
+
29
+ // ここではメンバ関数の宣言のみ
30
+
31
+ int getM1();
32
+
33
+ int getM2();
34
+
35
+
36
+
37
+ // OK: クラス定義内でメンバ関数を定義した場合、暗黙にinline関数となる
38
+
39
+ int getM3() {
40
+
41
+ return m3;
42
+
43
+ }
44
+
45
+ };
46
+
47
+
48
+
49
+ // OK: クラス定義外で明示的にinlineキーワード指定すればinline関数となる
50
+
51
+ inline int Foo::getM1() {
52
+
53
+ return m1;
54
+
55
+ }
56
+
57
+
58
+
59
+ // NG:クラス定義外でinlineキーワードがなければ非inline関数となる
60
+
61
+ int Foo::getM2() {
62
+
63
+ return m2;
64
+
65
+ }
66
+
67
+ ```