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

回答編集履歴

1

誤記訂正

2017/01/20 12:55

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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