簡體   English   中英

有沒有使用括號來表示NSNumber文字的原因?

[英]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. 更容易進行可視化解析,尤其是當數字為負數或宏時(Xcode語法高亮顯示不能正確地着色@-1@INT_MAX )。
  2. 如果需要,以后可以更輕松地更改為非常量表達式,而無需添加括號。 類似於關於將“大括號”添加到單行if if語句的“future proofing”的論點。

但是,是否有任何負面或理由堅持文字? 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM