Cocoa では NSInteger と int のどちらを好みますか?またその理由は何ですか?
-
08-06-2019 - |
質問
NSInteger
/NSUInteger
これらは、通常の組み込み型の Cocoa 定義の置き換えです。
組み込みよりも NS* タイプを使用することに利点はありますか?どちらが好きですか、またその理由は何ですか?は NSInteger
そして int
32 ビット/64 ビット プラットフォームで幅は同じですか?
解決
私の理解では、NSInteger et al.は、対応する C 型のアーキテクチャーセーフなバージョンです。基本的にそのサイズはアーキテクチャによって異なりますが、たとえば NSInteger は現在のアーキテクチャで有効なポインタを保持することが保証されています。
Apple は、OS X 10.5 以降で動作するためにこれらを使用することを推奨しており、Apple の API: もこれらを使用するため、これらを使用する習慣を身に付けることをお勧めします。もう少し入力する必要がありますが、それを除けば、使用しない理由はないようです。
他のヒント
64 ビット ランタイムの量子化の問題
状況によっては、代わりに標準タイプを使用する正当な理由がある場合があります。 NSInteger
:64 ビット システムでの「予期しない」メモリの膨張。
明らかに、整数が 4 バイトではなく 8 バイトの場合、値によって使用されるメモリの量は 2 倍になります。ただし、すべての値が整数であるわけではないため、通常はアプリケーションのメモリ フットプリントが 2 倍になることは期待できません。ただし、Mac OS X がメモリを割り当てる方法は、要求されたメモリの量に応じて変わります。
現在、512 バイト以下を要求すると、 malloc
次の 16 バイトの倍数に切り上げます。ただし、512 バイトを超えるデータを要求する場合は、 malloc
次の 512 の倍数 (少なくとも 1024 バイト) に切り上げます。次に、特に 5 つの要素を宣言するクラスを定義するとします。 NSInteger
インスタンス変数、および 32 ビット システムでは各インスタンスは、たとえば 272 バイトを占有します。64 ビット システムでは、理論上、インスタンスには 544 バイトが必要です。ただし、メモリ割り当て戦略により、実際にはそれぞれが 1024 バイトを占有することになります (ほぼ 4 倍の増加)。これらのオブジェクトを多数使用すると、アプリケーションのメモリ使用量が予想よりもかなり大きくなる可能性があります。交換した場合 NSInteger
変数と sint_32
変数の場合は、512 バイトのみを使用します。
したがって、使用するスカラーを選択するときは、必ず賢明なものを選択してください。32 ビット アプリケーションで必要な値よりも大きな値が必要な理由はありますか?秒数をカウントするために 64 ビット整数を使用する必要はほとんどありません...
NSInteger と NSUInteger の実際の存在理由は 64 ビットです。10.5 より前には、これらは存在しませんでした。この 2 つは、64 ビットでは Long として、32 ビットでは int として単純に定義されます。
#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
したがって、「ビットネイティブ」サイズが必要な場合は、より基本的な C 型の代わりにこれらを使用します。
私は標準の C スタイルの宣言を好みますが、それは複数の言語を切り替えるためであり、それについてあまり考える必要はありませんが、nsinteger を検討し始める必要があるように思えます。
ファイルまたはネット上でデータをインポートおよびエクスポートするために使用します UInt32, SInt64 等...
これらは、アーキテクチャに関係なく一定のサイズであることが保証されており、同様にそれらの型を共有する他のプラットフォームや言語にコードを移植するのに役立ちます。