2013-09-11 8 views
9

64ビットアーキテクチャのiPhoneが登場しました。 longは64ビットになります(intは32ビットのままです)、NSIntegerが使用されているところはすべてlongであり、32ビットではないため64ビットになります。また、Twitterには「NSIntegerをどこでも使用してintではありません。どこでもNSIntegerを使用する必要がありますか?

32ビットを超えない値を格納する必要がある場合(たとえば、ループ回数が25回のループなど)、32ビット(少なくとも)の上位ビットが空である。

プログラムが32ビット整数で動作していた場合、整数を64ビットで使用すると、メモリを使い果たしたときのメリットはありますか?

また、64ビット整数を使用すると、32ビット整数を使用する場合とは異なる結果が生じる場合があります。したがって、NSIntegerを使用すると、iPhone 5Sでは動作しますが、古いデバイスでは動作しない場合があります。一方、intまたはlongが明示的に使用されている場合、結果はどのデバイスでも同じになります。

答えて

-1

NSIntegerの内部ストレージはさまざまなバッキングタイプのいずれかになり得ます。なぜなら、どこにでも使用でき、それを心配する必要がないからです。

1

32ビットを超えない値を保存する必要がある場合、なぜ長い間使用する必要がありますか?

実際にその保証を行うことができれば、64ビットタイプを32ビットタイプよりも高く評価する理由は絶対にありません。有界ループ、カウンタ、一般的な算術などの単純な演算では、32ビットの整数で十分です。しかし、より複雑な操作、特にオーディオや画像処理を行うような高性能アプリケーションに必要なものは、64ビットモードで処理できるデータ量の増加が重要です。

プログラムが32ビット整数で動作していた場合、64ビットを整数として使用するとどのような利点がありますか?

メモリを増やすと悪いことになります。いくつかのデータ型のサイズを倍増させることで、メモリ内のより多くの場所に対処することができ、対処できるメモリが増えるほど、OSがコードを読み込む時間が短縮されます。さらに、プロセッサバス内のデータのレーン数を2倍にすると、1回の処理で処理可能な値がさらに大きくなります。また、レジスタサイズの増加は、より多くのデータを保持することができます1つのレジスタ。これは、ほとんどのアプリケーションの速度をほぼ自動的に2倍にするという単純な表現に相当します。

また、64ビット整数を使用すると、32ビット整数を使用する場合とは異なる結果が生じる場合があります。 ...

はい、そうはいかないと思います。 32ビットのデータ型と演算、64ビット演算(ソフトウェアで最もシミュレートされるか、または32ビットホストでは特殊なハードウェアやオペコードによってシミュレートされる)は、サイズに関して「比較的安定」です。異なるコンパイラが異なるバージョンの64ビットデータ型を実装しているため、64ビットアーキテクチャではほとんど保証することはできません(LP64, SILP64, and LLP64参照)。実際には、これは、64ビット型を32ビット型にキャストすることを意味します。たとえば、intへのポインタは情報の損失につながることが保証されていますが、64ビットであることが保証されている2つのデータ型LP64で - 受け入れられます。 ARMは通常、LP64を使用してコンパイルされます(すべてのintは32ビット、すべてのlongは64ビットです)。繰り返しますが、ほとんどの開発者はスイッチの影響を受けてはいけませんが、整数に格納しようとする任意の数を扱うときは、精度が問題になります。

そのため、NSUIntegerとNSIntegerをパブリックインターフェイスで使用し、固有の境界チェックやオーバーフローガードがないAPIを使用することをお勧めします。たとえば、TableViewはNSUInteger量のデータを要求します。なぜなら、32ビットと64ビットのデータ構造を心配しているわけではなく、コンパイルされたアーキテクチャについて保証することができないからです。アーキテクチャに依存しないデータ型を作るAppleの試みは、実際にはちょっとした贅沢です。どちらのアーキテクチャでも、コードをコンパイルして「うまく動作する」ために必要な作業はほとんどありません。

+1

あなたの2番目の答え「メモリを増やすことは悪いもののように思えます」はまさに私が探していた答えのようなものです。残念ながら、私はコンピュータ科学のバックグラウンドを持っていないので、私の頭の上を完全に航海しました。 64ビットのスペースに数字「3」を格納することが実際にアプリのスピードを上げる方法を示す例がありますか?私はそれがちょうどスペースの巨大な浪費と恐ろしく非効率なように思えるJonathanに同意する。 –

+0

これはまったく同じ 'MOV'命令です。スピードアップの原因となる小規模な操作ではなく、プロセッサーのバスに沿って流れるデータの量によって違いが生じます。それはちょうど2の代わりに4車線のハイウェイを持っていることに似ていますし、次にモンスタートラック集会を開催しようとしています。より小さなデータ(通常の車のようなもの)に合わせて、データを細かくして順番に走らせることなく、大型トラックを握ることができます。 – CodaFi

+1

ああ、アナロジー。私はすきです。あなたのアナロジーを使って、背中に孤独な小さな子供が1人しかいない大規模なバスを運転するような、小さな数字には「長い」を使用していませんか?パックされたバスと同じ容量のスペースを占めますが、そのスペースが無駄になります。 (2番目の考えでは、私が混乱させているかもしれない)私は本当に基本的なものを掴んでいないように感じますが、同じMOV命令であっても、MOVは64ビット空間は32ビット空間に格納されるものの2倍の長さを要するだろうか? –

-1

あなたのアプリが32または64ビットエンジンで実行されていて、__LP64__マクロを使用して、背後の変数を適切なデータ型に変換する場合、アップルは下位互換性を考慮します。

#if __LP64__ 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 
+2

これは私の質問の全体的なポイントです... –

+0

NSIntegerは、あなたのOSで、常にiOS7の前後にアクセス可能な「最大の」整数データ型を提供します。そして、このマクロはあなたのosバージョンを気にします。特定の問題に適した「最小の」データ型を使用することを常にお勧めします。 iOS7の前後にある64ビットの32ビット整数にブール値を確実に格納することができます。 – XcodeJunkie

関連する問題