2017-03-24 6 views
1

多くの書籍では、算術関数定義と関数定義のためのビットを無駄にしてはいけないと言われています。私は0から255の非常に多くの小さな数値がchar型変数として定義されているのを見て、さらに大きな正の数はunsigned short int型として定義しました。戻り値を表すために短い整数を使用しないのはなぜですか?

戻り値を表すのにintの代わりにunsigned short intまたはchar型を使用しないのはなぜですか?

私が試した:

char main(){return 0;} 

それはokです。

+4

「そんなに多くの本は私たちが少しも浪費してはならないと言っています...」と書かれている本は何ですか?それは真実ではありません。 –

+4

あなたの関数はあなたが気に入っているものは返すことができますが、 'main()'は返すことができません。これは、C標準がそれをどのように指定しているのかによって 'int 'を返します。 – Havenard

+3

標準では特に、 'int'を返すには' main'が必要です(少し過度の単純化)ので、呼び出し側の環境で期待されるものです。あなたが好きであれば 'main'以外の関数には' char'の戻り値の型を使うことができますが、それは大きな助けにはなりません。 –

答えて

4

shortまたはcharを返すことに伴う節約は、ほとんどがほとんどありません。intです。 Cの大部分の実装では、戻り値を保持するためにマシン・レジスタが使用されますが、の代わりにintを返す唯一の違いは、レジスタの一部が未使用のままであることです。

shortを返すため、その後事実上唯一の理由、(さておき、これは標準のは、それがすることを保証するものではありませんが、あなたのための「働く」。またmaincharを返す理由であるため) intの代わりにshortで作業する明確な理由がある特定のアルゴリズムがある場合です。これはあまり一般的ではありません。

レコードについては、関数引数についても同じことが言えます。

+0

そして、私が正しく理解していれば、追加のclock-tickまたは2つをint型から小さな型のデータ選択に暗黙的に変換するために使うので、レジスタの部分的な使用に加えて、「int」を使用する。 –

+0

@ DavidC.Rankin:あなたがそのアイディアをどこで得たのかはっきりしていません。キャストにはコストがかかるかもしれませんが、それは実際には私たちが話していたものではありませんか? (そして、それらが無料でも、おそらく過半数であっても多くの状況があります。) – Dolda2000

+0

@ DavidC.Rankin:第2の考えでは、インテルCPUの部分登録屋について話していると思います。それでも、それは、もしあれば、キャストの問題だけです。あなたが「短い」と同じ値を使用し続ける限り、私はここで話していることを信じています。 – Dolda2000

1

アセンブリ言語とマイクロコンピュータの原理について知りたければ、データにアクセスするための高速な方法(1サイクル)です。

32ビットまたは64ビットCPUの場合、1命令サイクルで32ビットまたは64ビットのデータを取得または設定できます。 変数がintとして定義されている場合、CPUは値を1サイクル取得または設定できます。 32ビットCPUのcharまたはshortを使用する場合、CPUはその値を取得または設定するためにより多くのサイクルを必要とします。

8ビットまたは16ビットCPUで作業する場合は異なります。しかし、通常intの長さはCPUのビットと同じなので、integerはアクセスする高速タイプです。

+0

* "32ビットCPUでcharまたはshortを使用する場合、CPUはその値を取得/設定するためにより多くのサイクルが必要です。" * - これはまれです。現代のCPUの大部分は、全く同じ速度の8,16,32、または64ビットの数字で動作します。私が考えることができる唯一の現実世界の例外は、BWX Alphaプリプロセッサーであろうと思っています。 – Dolda2000

+0

DSPやARMのアセンブリコードをチェックしたことがありますか? DSPやARMがコードを最適化する方法を知っていますか?たとえば、最適化中にアクセス速度のためにcharを整数に変換します。 – Harrison

+0

確かに、DSPコードについてはそれほど多くはありませんが(一般的な回答ではかなり難解ですが)、私はARMでどのような操作をしているのか不思議です。 'short'sや' char'sの 'int'を使って作業するときのパフォーマンスヒットがあるのはどこですか?私は、1つは、特定のケースを発見していない。 – Dolda2000

関連する問題