2010-12-15 14 views
1

Kann diese Anweisung jemals fehlschlagen?Speicherzuordnung in Objective-C

if (@"Hello") foo();?

Mit anderen Worten kann es eine Situation geben, in der im Compiler nicht genügend Speicherplatz für Literale zugeordnet werden kann. Ich weiß, das klingt lächerlich für kurze Literale, aber was ist mit wirklich langen.

Antwort

3

Nr

NSString Literale werden „zugeordnet“ bei der Kompilierung und bilden einen Teil des Textsegment des Programms.

bearbeiten

den anderen Teil der Frage zu beantworten, wenn der Compiler genügend Speicher zuweisen für die wörtliche ausfällt, wird nicht die if-Anweisung scheitern, aber die Kompilierung wird.

Ich weiß nicht, was die effektive Obergrenze für die Länge eines Stringliteral ist, aber es ist gebunden zu sein, weniger als NSIntegerMaxunichars weil NSNotFound als NSIntegerMax definiert ist. Gemäß der clang docs ist die Länge eines String-Literals in Bytes unsigned int und NSString String-Literale sind Sequenzen von unichars.

1

Ich bin mir ziemlich sicher, wenn Sie versuchen, eine Datei mit der wörtlichen

@" ... 1TB worth of characters ... " 

der Compiler wird scheitern zu kompilieren. Der C-Standard available here besagt, dass jeder kompatible Compiler mindestens 4095 Zeichen pro Zeichenfolgenliteral usw. unterstützen muss. Siehe Abschnitt 5.2.4.1. Ich bin sicher, dass GCC und Clang viel größere Literale erlauben.

+0

ist 4095 eine obere Grenze oder eine untere Grenze? – shreyasva

+0

Sorry, ich habe vergessen, "mindestens" hinzuzufügen. Bitte lesen Sie den Standard selbst! Ich bin mit dem echten Dokument verbunden, so dass Sie es lesen können: p – Yuji