0

-Wconversion警告をオンにしてデスクトップで GCC を使用すると、数値リテラルを使用した数学演算中に sshortが s に昇格することが明らかになります。int

unsigned short i = 10; // Obviously truncates to short immediately
unsigned short j = 30; // Same here

i = j + 2; // Warnings imply j gets promoted to int here, demands cast

「ショートの方が常に速い」というルールがスローされているARMターゲットでは、ほとんどすべての数学演算(特にリテラルを含む)中にint、演算のために s に昇格されるというのは本当ですか?

もしそうなら、 s を使用する理由はshort、コンパイラが境界が適切かどうかをチェックするのに役立つ以外にありますか? 私は大量のショート パンツを扱っているわけではないので、保管スペースは問題にならないようです (そうですか?)。

注意。これはオーディオ処理であるため、最適化を行っているわけではなく、これについて考える必要があります。

4

3 に答える 3

4

「shorts は常に高速である」というルールがスローされている ARM ターゲットでは、ほとんどすべての数学演算 (特にリテラルを含む) で演算の int に昇格されるというのは本当ですか?

ほとんどの演算子では、整数昇格規則によりshortオペランドが昇格されます。int

例えば

i = j + 2;  // j is promoted to int because of integer promotion

だけでなく、

i = i + j; // i and j are promoted to int in the + expression 

スローされたルールが「ショートは常に速い」というARMターゲットでは

ARM ではshort-bit16ですが、ARM のワード サイズは32-bit なので、このステートメントは間違っています。 shortまたはchar、符号拡張またはゼロ拡張が必要であり、速度が低下します。 shortメモリを節約するために使用できますが、パフォーマンスが向上intするかlong、より高速になります。

于 2013-07-24T11:19:37.640 に答える
2

算術演算子は、より小さい型intを引数として受け入れません。

于 2013-07-24T11:26:34.007 に答える
2

正式には、言語では、ほとんどの算術演算の前に (またはintに) 昇格されるよりも狭い型が必要です。これは、あなたの例では、 が に昇格し、加算が で実行され、結果が代入によって に変換されることを意味します。intunsigned intjintintshort

ただし、コンパイラは、プログラムの観察可能な動作を変更しない場合、これらの変換を自由に省略できます。この場合の結果は に変換されるため、これがここに適用されます。コンパイラは、サイズshortの加算を直接実行する命令を発行できますが、これは有効です。shortそれがターゲット プラットフォームでより高速に実行される場合は、そうなると予想できますclang

于 2013-07-24T14:10:45.267 に答える