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