ここから本文です

typedef #defineについて

phe********さん

2012/12/1621:32:37

typedef #defineについて

たびたびの投稿失礼します。

#define define_uint8_t unsigned char
typedef unsigned char typedef_uint8_t
の違いについてお伺いしたいです。
端的に伺いますと、実行速度の差はあるのでしょうか。

#defineの場合、プリプロセッサなので単純置換されてからコンパイルされるため、
define_uint8_t a ;
unsigned char b ;
a, bどちらも、コンパイラの扱い(オブジェクトコード生成後の扱いも)全く同じなのはわかるのですが、
typedefで単純に型に別名を付けた場合も完全にunsigned charと同じ扱いになってしまうのでしょうか。
(コンパイル時の解釈になのはわかるのですが、生成されるオブジェクトコードに違いがあるのか、ということです)

私のイメージでは、コンパイル後もtypedef_uint8_tの情報が残されるので、実行時にこの型はunsigned charだよと解釈する(というか参照?)するのためのステップが増えるイメージがあるのですが、どうなのでしょうか。
(コンパイラの最適化オプションのレベルによっては置換されそうな気もするのですが、C言語の仕様的にはどうなのでしょうか)

わかりにくい質問で申し訳ないです。
Cに詳しい方、回答いただけると嬉しいです。

閲覧数:
281
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

two********さん

2012/12/1622:26:02

GCC: (GNU) 4.7.2 on Fedora、最適化指定無しの条件で調べましたが、typedefと#defineで、まったく同一のアセンブラコードを出力しました。

ただ#defineにはよく知られた問題があるので、型の別名を指定するにはtypedefが適当だと思われます。
(例)
#define intptr int*
intptr p1, p2; // p1はint型ポインタだが、p2はただのint型

質問した人からのコメント

2012/12/17 14:05:48

なるほど言われてみればdefineの場合2つ目以降単純な変数宣言になってしまいますね。

typedefで別名をつけても元の型と同じコードを出力したとのことで安心しました。
心置きなくuint8_t使いたいと思います!
重ねてありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

きてらいさん

2012/12/1621:39:57

所詮最終的には変数名とか型名とかは全部きれいさっぱり無くなって、
機械語で決まったアドレスにアクセスする物になるので、
大きささえ同じなら全く違いは無いと思います。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる