gpt4 book ai didi

objective-c - 有什么理由不对 NSNumber 文字使用括号吗?

转载 作者:太空狗 更新时间:2023-10-30 04:01:00 25 4
gpt4 key购买 nike

我最近一直在学习现代 Objective-C,并开始为 NSNumber 文字使用美妙的新语法。阅读之后实际上有两种创建 NSNumber 的方法:

// NSNumber literal
NSNumber *a = @42;

// Boxed expression
NSNumber *a = @(42);

最终结果是相同的(两者都生成一个值为 42 的 NSNumber),但是对于简单的数字常量,是否有任何理由在盒装表达式上使用文字?

我可以看到两个更喜欢盒装表达式的样式原因:

  1. 更易于视觉解析,尤其是当数字为负数或宏时(Xcode 语法高亮显示无法正确显示 @-1@INT_MAX)。<
  2. 以后如果需要更容易更改为非常量表达式,而无需添加括号。类似于关于将大括号添加到单行 if 语句以“面向 future ”的论点。

但是是否有任何负面因素或理由坚持使用文字? Clang page没有在盒装表达式部分提及任何表明性能损失或其他负面影响的内容。

那么对于这些​​简单的数字常量来说,这只是一种风格吗?

最佳答案

这些实际上编译成同一个程序集:

NSNumber *value = @42;
NSNumber *otherValue = @(42);

这导致了以下优化的程序集:

    // NSNumber *value = @42;

movl L_OBJC_CLASSLIST_REFERENCES_$_-L0$pb(%edi), %eax <-- NSNumber
movl L_OBJC_SELECTOR_REFERENCES_-L0$pb(%edi), %ecx <-- numberWithInt:
movl %ecx, 4(%esp)
movl %eax, (%esp)
movl $42, 8(%esp) <-- Here's your value
calll L_objc_msgSend$stub

// NSNumber *value = @(42);

movl L_OBJC_CLASSLIST_REFERENCES_$_-L0$pb(%edi), %eax <-- NSNumber
movl L_OBJC_SELECTOR_REFERENCES_-L0$pb(%edi), %ecx <-- numberWithInt:
movl %ecx, 4(%esp)
movl %eax, (%esp)
movl $42, 8(%esp) <--- and here again
calll L_objc_msgSend$stub

值得注意的是,它甚至足够智能,可以为您进行预计算:

    // NSNumber *value = @(42 + 1);

movl L_OBJC_CLASSLIST_REFERENCES_$_-L0$pb(%edi), %eax <-- NSNumber
movl L_OBJC_SELECTOR_REFERENCES_-L0$pb(%edi), %ecx <-- numberWithInt:
movl %ecx, 4(%esp)
movl %eax, (%esp)
movl $43, 8(%esp) <--- Hey; it's precomputed to 43. Nice.
calll L_objc_msgSend$stub

正如@Zaph 所说,这对编译器来说无关紧要。

关于objective-c - 有什么理由不对 NSNumber 文字使用括号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20056494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com