2

私はC/C++の使用に比較的慣れていません。私は現在 Visual Studio 2010 を使用しており、他の誰かが書いたコードを分析しています。関数がメモリを大量に使用しているという問題が通知されました。その中のほぼすべてのポインターが Float_64 であり、それらを Float_32 に変更すると、どのような影響があるのか​​疑問に思っていました。Float_64 と Float_32 で使用されるメモリの量と、切り替えによるデータの損失はありますか? これがすでに尋ねられている場合は申し訳ありませんが、見つけられなかったようです。

ありがとうございました!

4

3 に答える 3

2

Float_64およびFloat_32C++ 標準で定義されている C++ 型ではないため、アプリケーションまたは使用しているライブラリに固有のものでなければなりません。

ただし、名前がリモートで正常な場合、a のサイズはFloat_6464 ビット (最新のアーキテクチャでは 8 バイト) になり、aFloat_32は 32 ビットになります。したがって、Float_32の代わりにを使用するように切り替えるFloat_64と、float 自体のメモリ負荷が半分に軽減されます。さて、値へのポインタは言うまでもなく、以前と同じサイズのままです。したがって、次のことを考慮してください。

Float_64 my64;  
Float_32 my32;

Float_64 * my64_ptr = &my64;
Float_32 * my32_ptr = &my32;

上記のコードでは、 asmy64の半分です-- それぞれ 64 ビットと 32 ビット (8 バイトと 4 バイト)。ただし、とはポインターであり、ポインターは何を指すかに関係なく同じサイズです。sizeof()my32my64_ptrmy32_ptr

反響は別の考慮事項です。AFloat_32は、おそらく a よりも精度が低く、Float_64おそらく半分かそれ以下です。非常に重要度の高い float が必要な場合は、小さい型に変換すると精度が低下する可能性があります。確実に知る唯一の方法は、両方の型の仕様を調べ、操作する必要があるデータを分析することです。ただし、一般的な経験則として、ほとんどの用途では低い精度で十分な可能性があります。

于 2012-05-31T14:38:24.247 に答える
2

まず第一に、私が知る限り、組み込み型ではありませんFloat_32。これは、おそらく(32) と(64)に対して、それらがd にFloat_64なっていることを示唆しています。typedeffloatdouble

そうであると仮定すると、おそらくFloat_32そうでなくても、おそらく32ビットのスペースが必要で、Float_64幅は64ビットです。名前からしてそうなのです。それらはポインターであると言うので、サイズはプラットフォームに依存しますが (32 ビット システムでは 32 ビット、64 では 64)、それでも同じサイズの値を指します (したがって、最終的なメモリの使用はポインター + 型、またはを使用して 64 ビット システムで 128 ビットFloat_64; 残りの計算を行うことができると確信しています)。

Float_64すべてのをに置き換えるFloat_32ことで、メモリの使用を 4 分の 1 から 2 分の 1 に削減できますが、どれだけ節約できるかは、使用中の数値の数によって異なります。ほとんどの場合、役に立たない可能性がありますが、数百万のフロートがある場合は非常にうまくいく可能性があります。

考えられる影響は、もう少し興味深いものです。浮動小数点数には、特にその範囲の端近くで、精度が失われるという厄介な特性があります。64 ビット float (double) の場合、これは数兆をはるかに超えています。ただし、32 ビットの場合、数十億を超えると精度が失われ始め、数兆を超えると、数値がかなりスキップし始めます。使用しているデータの種類によっては、影響を受ける可能性があります。

于 2012-05-31T14:38:29.367 に答える
0

Float_64 と Float_32 が使用するメモリ量

それぞれ 8 バイト (64 ビット) と 4 バイト (32 ビット)。

切り替えによるデータの損失はありますか?

トン!は単精度(多くの場合)Float_32と呼ばれるもので、は倍精度(通常は) です。floatFloat_64double

double は float の 2 倍以上の精度を持っているため、これは実際にはちょっとした誤称です。double は小数点以下 16 桁未満を正確に表すことができますが、float は 7 桁以上しか表すことができません。つまり、切り替えると小数点以下 9 桁の精度が失われます。 、一部のアルゴリズムを簡単に破ることができます。

于 2012-05-31T14:41:33.290 に答える