回答編集履歴

1

誤記訂正

2017/01/20 12:55

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  型が違うポインターどうしての代入などの演算はプログラマーになんらかの意図があるはずであり、質問者さんがおっしゃる「暗黙的キャスト」は避けるべきコーディングです。そのまま警告を放置するなら何かが起こるのでしょうがそれを気にすること自体はあまり有意義なことではないと思います。
6
6
 
7
- char*->double*への明示的なキャストについて考えてみますと「double型のアドレスとして妥当なアラインメントであるかをプログラマーが意識した上で敢てキャストする」と考えるのが普通だと思います。ではわざとアラインメントがおかしなキャストをしたとしたらどうなるかですが、現在のclangの規格で何か規定があるのかどうか自分は知りません。
7
+ char*->double*への明示的なキャストについて考えてみますと「double型のアドレスとして妥当なアラインメントであるかをプログラマーが意識した上で敢てキャストする」と考えるのが普通だと思います。ではわざとアラインメントがおかしなキャストをしたとしたらどうなるかですが、現在のclangの規格で何か規定があるのかどうか自分は知りません。
8
8
 
9
9
 
10
10
 
11
- 手元のcygwin64でgcc使ってやってみるとアラインメントが適切でないポインターdouble*変数へそのまま代入されてました。この状態で何がおこるかですが、自分が知る限り結果はプロセッサの種類によって異なり、アラインメント例外を発するプロセッサと、いわれたとおりに動いてしまうプロセッサに大別されると思います。例えばインテルのプロセッサは後者だったと思います。ただ記憶装置(メモリー)は語境界でアクセスする前提で作られているのでプロセッサがアライメント境界をまたぐメモリーアクセスを許す場合、メモリーのアクセスが2回行われてプロセッサーで前半分と後ろ半分のデータをガッチャンとビット連結して結果を作る動作をするので「遅い」と思います。
11
+ 手元のcygwin64でgcc使ってやってみるとアラインメントが適切でないポインターdouble*変数へそのまま代入されてました。この状態で何がおこるか自分が知る限りプロセッサの種類によって異なり、アラインメント例外を発するプロセッサと、いわれたとおりに動いてしまうプロセッサに大別されると思います。例えばインテルのプロセッサは後者だったと思います。ただ記憶装置(メモリー)は語境界でアクセスする前提で作られているのでプロセッサがアライメント境界をまたぐメモリーアクセスを許す場合、メモリーのアクセスが2回行われてプロセッサー内部で前半分と後ろ半分のデータをガッチャンとビット連結して結果を作る動作をするので「遅い」と思います。
12
12
 
13
13
 
14
14