teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

再度訂正

2016/12/16 02:27

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  maisumakunさんのコメントをみて自分の回答は正しくないと気づきました。
2
- コードがすっきりするのは(B)ですが早いのは(A)ですね
2
+ コードがすっきりするのは(B)ですが早いのは(A)かもしれません
3
3
  `a.b.c.member ...`(A)
4
4
  `p=&a.b.c; p->member ...`(B)
5
5
 

1

訂正

2016/12/16 02:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,12 @@
1
+ maisumakunさんのコメントをみて自分の回答は正しくないと気づきました。
2
+ コードがすっきりするのは(B)ですが早いのは(A)ですね。
3
+ `a.b.c.member ...`(A)
4
+ `p=&a.b.c; p->member ...`(B)
5
+
6
+ 下記は取り消します。失礼しました。
7
+
8
+ ---
9
+
1
10
  「一般的には構造体の先頭アドレスを指すポインターを介してアクセスするのが一番早い」と考えてよいと思います。
2
11
 
3
12
  `p->member`
@@ -9,6 +18,10 @@
9
18
 
10
19
  コンパイラーの最適化によってはpのアドレスが既にregisterに入っているなら(1)は省略されてしまうこともあるかも知れません。そうならなくても(1)のアクセスはスタック上へのアクセスになるのでキャッシュヒットしている可能性が高くメモリーへアクセスしないでロードができる期待が高くなるといえましょう。
11
20
 
12
- これは`a->b->c.member`などに比べて早いというのは想像できると思います。なぜなら複数のCのメンバーへアクセスする度にポインターaの中身をロードしたりbの中身をロードするからです。しかしご質問は`a.b.c.member`と書いたときの比較ですね。どちらが早いかについていえばコンパイラーの最適化によって実質ポインターアクセスと同じスピードで動く機械語が生成されるかも知れませんし、そうならないかも知れません。しかし一般的にいえば同一の構造体内の複数のメンバーに連続してアクセスするならポインターを介してアクセスすることの方が早いと考えてよいと思います。
21
+ これは`a->b->c.member`などに比べて早いというのは想像できると思います。なぜなら複数のCのメンバーへアクセスする度にポインターaの中身をロードしたりbの中身をロードするからです。しかしご質問は`a.b.c.member`と書いたときの比較ですね。同じスピードで動く機械語が生成されるかも知れませんし、そうならないかも知れません。しかし一般的にいえば同一の構造体内の複数のメンバーに連続してアクセスするならポインターを介してアクセスすることの方が早いと考えてよいと思います。
13
22
 
14
- 細かい性能の違いが気になる場合はアセンブリーソースを比較してみるのがより明解だと思います。ただ高性能なCPUは前の命令をやりながら次の命令も並行してやってたりするので機械語の羅列を見ただけでは即座にどちらが早いというのは難しかもしれません。こういった単純なコーディングの違いでも性能に差がでる要因にはいろいろあると思うので実際に性能を図ってみた方が確実だと思います。
23
+ 細かい性能の違いが気になる場合はアセンブリーソースを比較してみるのがより明解だと思います。ただ高性能なCPUは前の命令をやりながら次の命令も並行してやってたりするので機械語の羅列を見ただけでは即座にどちらが早いというのは難しかもしれません。こういった単純なコーディングの違いでも性能に差がでる要因にはいろいろあると思うので実際に性能を図ってみた方が確実だと思います。
24
+
25
+
26
+
27
+