[英]Any reason to not use parentheses for NSNumber literals?
我最近一直在學習現代Objective-C,並開始使用NSNumber
文字的精彩新語法。 閱讀后,實際上有兩種方法可以創建NSNumber
:
// NSNumber literal
NSNumber *a = @42;
// Boxed expression
NSNumber *a = @(42);
最終結果是相同的(兩者都生成一個值為42的NSNumber
),但有沒有理由在盒裝表達式上使用文字來表示簡單的數字常量?
我可以看到兩種風格的理由來選擇盒裝表達式:
@-1
或@INT_MAX
)。 但是,是否有任何負面或理由堅持文字? Clang頁面沒有提到盒裝表達式部分中的任何表示性能損失或其他負面影響的內容。
那么在這些簡單的數字常量的情況下,這僅僅是一種風格的情況?
實際上這些編譯成同一個程序集:
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說,這對編譯器來說無關緊要。
由於每個案例實際上將整數“裝箱”成一個對象,因此這是一個明確的問題,類似於在不需要時為運算符優先級添加額外的“()”。
例如:2 + 3 * 4 vs:2+(3 * 4)
我個人寫@ 42而不是@(42)
但@(kMeaningOfLifeAndEverything)還可以;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.