2016-10-04 1 views
2

私のプロジェクトには、そのクラスに対して5000以上の定数が含まれています。だから私の疑問は、Objective-Cで定数を定義するために使用する最良の方法です。定数を定義するために、目的cのメモリ管理の文脈の中で最も良いのはどちらですか

の#define

または

のconst

+0

興味があるだけ、なぜこの問題はそれほどありませんか?あなたはあなたのアプリの全体的なメモリ占有量を調べましたか?それは、すべてのコード変更を行う前に最初にやる方が賢明なようです。 –

答えて

3

私はあなたのタスクを解決するための最善の方法は#defineディレクティブを使用していると思います。定義ディレクティブはランタイムでメモリを使用しません。このディレクティブは、コンパイラによって実行されます。

例:コード内で使用

#define MY_CONSTANT @"Hi" 

NSString* string = [MY_CONSTANT stringByAppendingString:@" Mac"]; 

Hereあなたはconstの変数のメモリ割り当てについて読むことができます。

+0

あなたは次のように書くこともできます: 'NSString * string = MY_CONSTANT" Mac ";' –

+0

ありがとう、あなたはこの機能の説明へのリンクを追加できますか? –

+1

https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#String-Constants –

0

実際にはケースによって異なります。あなたの場合、私は#defineがより良い選択肢だと思うと思います。私の知る限りでは

の#defineの場合 - >メモリアクセス。 token_stringが識別子の各出現に置き換えられると、exeサイズが増加します(リテラルの格納)。

変数のアクセスごとにメモリがヒットし、余分なexeサイズが増えます(変数の格納と変数の参照または参照のリテラルの格納)。よりよく理解するために

は、ちょうど上記の私のコメントの1を拡大し、以下のリンク "static const" vs "#define" vs "enum"static const vs #define

1

をご覧ください。質問は

#define MYSTRING @"This is a string"

対実際の結果は、ツール固有の

NSString *const myString = @"This is a string";

を言っています。しかし、Xcodeのから生成されたバイナリを調べ、1は次のようにあります:

予想したように、両方の文字列が、この場合には、バイナリでエンコードされている必要がありotool -v -s __TEXT __cstring BINARYNAME

を実行することで確認することができますように、彼らは __TEXT __cstringになります
Contents of (__TEXT,__cstring) section 
0000000100002f19 This is a string 

__TEXTは実行時にメモリに大量に読み込まれるため、技術的にメモリが消費されることに注意してください。 OPが尋ねたことに関連するより大きな疑問は、constを使用して__TEXT以外の追加メモリが発生するという行に沿っています。

リンカーは文字列の複数のインスタンスを最適化することに注意してください。言い換えれば:

NSString *const string1 = @"I'm a string"; 
NSString *const string2 = @"I'm a string"; 

のみ最終バイナリ__cstringにその文字列の1つのインスタンスをもたらすであろう。

したがって、NSString *を使用するオーバーヘッドは、少なくともポインタ参照のようです。これはどちらか、それがどのように定義されるかに応じて、__DATA __dataまたは__DATA __constセクションに配置されます。

もたらすであろう

NSString *const myString = @"This is a string";

もたらすであろう

0000000100003068 (__DATA,__const) non-external (was a private external) _myString

NSString *myString = @"This is a string";

を:

0000000100003d60 (__DATA,__data) non-external (was a private external) _myString

NSString *constは、定義する方法です。

したがって、64ビットのターゲットを想定すると、constとして5,000文字列のオーバーヘッドは少なくとも40,000バイトまたは〜39Kになります。私は少なくとも、何か別の隠されたことが行われている場合に備えて言います。しかし、一般的には、私はポインタがメモリ内の文字列を指すことを期待しています。

ほとんどのアプリでは、これはおそらく物の範囲ではあまり大きくありません。ですから、質問する必要があるのは、constを使用する利点は何ですか?

また、この点については、入力を省略して次のリンクを参照します。コンパイラがタイプチェックを行う際には、constを使用することをお勧めします。

Objective-C : #define vs extern const

#define vs const in Objective-C

関連する問題