我在课堂上宣布了一个iVar:
-tableView:viewForTableColumn:row:
当我检查LLVM IR时,它会告诉我:
@implementation LLVMIRTest{
NSString* ivarTest;
}
我不得不问为什么它是LLVM IR中的私人全球提及。为什么不只是私人?
这是完整的模块LLVM IR:
@OBJC_METH_VAR_NAME_ = private global [9 x i8] c"ivarTest\00", section "__TEXT,__objc_methname,cstring_literals", align 1
@OBJC_METH_VAR_TYPE_ = private global [12 x i8] c"@\22NSString\22\00", section "__TEXT,__objc_methtype,cstring_literals", align 1
答案 0 :(得分:0)
全局变量被视为模块作用域,在编译时与运行时进行初始化。
LLVM的大多数前端都将字符串放在模块范围内,并且需要global
或constant
标记。有一种方法可以在堆栈上存储字符串,但这在我的经验中很少见。我通常创建字符串
@somename = internal constant...
。
private
指示不要在模块外部公开符号。
我认为这就是Objective-C为类添加类型和工具支持的方式。如果查看输出的其余部分,可能会在调用之前将指向这些字符串的指针传递到RT库(例如%x = load ...
)。
OP添加列表后更新
您列出的是“静态”字样。代表你的类的模块级构造。如果仔细观察,类声明包含许多嵌入式结构和字符串。因为这些声明是在模块级别,所以它们被声明为global
,正如您所期望的那样,它们将它们放在数据段中,因为它是数据后跟而不是方法实现。您可以将您的课程视为structure
,不仅包含变量“iVar”的空间,还包含Objective-C RT所需的其他信息。
因此,类及其变量被视为模块级声明,它们在模块级别表示为数据结构,由LLVM标准标记为global
。请参阅LLVM Global Variable文档。