字符串形成是由编译器优化的吗?

nev*_*ing 4 compiler-construction cocoa objective-c

我试图回答有关==运算符的另一个问题,我创建了这段代码:

NSString *aString = @"Hello";
NSString *bString = aString;
NSString *cString = @"Hello";

if (aString == bString)
    NSLog(@"CHECK 1");

if (bString == cString)
    NSLog(@"CHECK 2");

if ([aString isEqual:bString])
    NSLog(@"CHECK 3");

if ([aString isEqual:cString])
    NSLog(@"CHECK 4");

NSLog(@"%i", aString);
NSLog(@"%i", bString);
NSLog(@"%i", cString);
Run Code Online (Sandbox Code Playgroud)

但对结果感到惊讶:

Equal[6599:10b] CHECK 1
Equal[6599:10b] CHECK 2
Equal[6599:10b] CHECK 3
Equal[6599:10b] CHECK 4
Equal[6599:10b] 8240
Equal[6599:10b] 8240
Equal[6599:10b] 8240
Run Code Online (Sandbox Code Playgroud)

这里有一些编译技巧吗?

Jer*_*man 6

有明显的字符串统一,至少在单个编译单元中.我建议您进行简短的访问,man gcc在此期间您将访问"string"的所有用途.你会发现一些与文字NSString和它们的免费桥接对应物直接相关的选项,CFStrings:

  • -fconstant-string-class= class-name设置用于实例化@"..."文字的类的名称.它默认为NSConstantString除非您使用GNU运行时.(如果你不知道你是不是,你不是.)
  • -fconstant-cfstrings允许CFString在编写时使用内置函数创建s CFSTR(...).

-fwritable-strings虽然不推荐使用此选项,但您可以使用禁用c字符串文字的uniquing .我无法想出一个可以阻止NSString在Objective-C文件中单独识别文字的选项组合.(任何人都想与Pascal字符串文字说话吗?)

你看到-fconstant-cfstrings在用于创建文字CFString.hCFSTR()宏的定义中发挥作用CFString:

    #ifdef __CONSTANT_CFSTRINGS__
    #define CFSTR(cStr)  ((CFStringRef) __builtin___CFStringMakeConstantString ("" cStr ""))
    #else
    #define CFSTR(cStr)  __CFStringMakeConstantString("" cStr "")
    #endif
Run Code Online (Sandbox Code Playgroud)

如果你在非内置的实现看起来__CFStringMakeConstantString()CFString.c,你会看到该功能确实执行使用非常大的uniquing CFMutableDictionary:

    if ((result = (CFStringRef)CFDictionaryGetValue(constantStringTable, cStr))) {
        __CFSpinUnlock(&_CFSTRLock);
    }
    // . . .
    return result;
Run Code Online (Sandbox Code Playgroud)

另请参阅对问题的回答:"字符串常量和字符串文字之间有什么区别?"