私のプロジェクトには、そのクラスに対して5000以上の定数が含まれています。だから私の疑問は、Objective-Cで定数を定義するために使用する最良の方法です。定数を定義するために、目的cのメモリ管理の文脈の中で最も良いのはどちらですか
の#define
または
私のプロジェクトには、そのクラスに対して5000以上の定数が含まれています。だから私の疑問は、Objective-Cで定数を定義するために使用する最良の方法です。定数を定義するために、目的cのメモリ管理の文脈の中で最も良いのはどちらですか
または
私はあなたのタスクを解決するための最善の方法は#defineディレクティブを使用していると思います。定義ディレクティブはランタイムでメモリを使用しません。このディレクティブは、コンパイラによって実行されます。
例:コード内で使用
#define MY_CONSTANT @"Hi"
:
NSString* string = [MY_CONSTANT stringByAppendingString:@" Mac"];
Hereあなたはconstの変数のメモリ割り当てについて読むことができます。
あなたは次のように書くこともできます: 'NSString * string = MY_CONSTANT" Mac ";' –
ありがとう、あなたはこの機能の説明へのリンクを追加できますか? –
https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#String-Constants –
実際にはケースによって異なります。あなたの場合、私は#defineがより良い選択肢だと思うと思います。私の知る限りでは
:
の#defineの場合 - >メモリアクセス。 token_stringが識別子の各出現に置き換えられると、exeサイズが増加します(リテラルの格納)。
変数のアクセスごとにメモリがヒットし、余分なexeサイズが増えます(変数の格納と変数の参照または参照のリテラルの格納)。よりよく理解するために
は、ちょうど上記の私のコメントの1を拡大し、以下のリンク "static const" vs "#define" vs "enum" とstatic const vs #define
をご覧ください。質問は
#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
を使用することをお勧めします。
興味があるだけ、なぜこの問題はそれほどありませんか?あなたはあなたのアプリの全体的なメモリ占有量を調べましたか?それは、すべてのコード変更を行う前に最初にやる方が賢明なようです。 –