2012-04-21 13 views
17

Nhìn vào định nghĩa của NS_INLINE có vẻ như lợi thế của việc sử dụng nó trên static inline là khả năng tương thích với trình biên dịch, đúng không? Nên NS_INLINE luôn được sử dụng thay vì static inline trên các chức năng c trong các dự án khách quan c?Ưu điểm của NS_INLINE đối với nội tuyến tĩnh là gì?

#if !defined(NS_INLINE) 
    #if defined(__GNUC__) 
     #define NS_INLINE static __inline__ __attribute__((always_inline)) 
    #elif defined(__MWERKS__) || defined(__cplusplus) 
     #define NS_INLINE static inline 
    #elif defined(_MSC_VER) 
     #define NS_INLINE static __inline 
    #elif TARGET_OS_WIN32 
     #define NS_INLINE static __inline__ 
    #endif 
#endif 

Trả lời

10

Có, nó dành cho khả năng tương thích với trình biên dịch, nhưng tôi nghĩ rằng việc sử dụng khung công tác nhiều hơn là mã của riêng bạn. Bạn được tự do sử dụng nó, tất nhiên, nhưng tôi sẽ không bận tâm.

+0

Điều gì sẽ xảy ra nếu mã cho thư viện được người khác sử dụng, bạn có nên sử dụng 'NS_INLINE' sau đó không? – keegan3d

+3

Nó sẽ được sử dụng trên các nền tảng khác ngoài Apple? Với GnuStep hoặc tương tự? Nếu không, thì không. Có khoảng 0 cơ hội phát triển cho Mac OS X hoặc iOS sẽ không tương thích với 'static inline'. –

21

Nhìn vào định nghĩa của NS_INLINE có vẻ như lợi thế của việc sử dụng nó trên dòng nội tuyến tĩnh là khả năng tương thích với trình biên dịch, đúng không?

Chỉ một phần. Bạn phải đánh giá chuỗi công cụ chi phối ở đây và hỏi "tại sao static inlinekhông sử dụng hoặc tại sao nó không đủ?". Chuỗi công cụ chi phối chứa thuộc tính __attribute__((always_inline)). Vì vậy, thực sự có hai phần cho điều này:

  • a) Khả năng tương thích Vì vậy, nó bổ sung tính tương thích cho nhiều trình biên dịch.

  • b) Sử dụng __attribute__((always_inline)) trong chuỗi công cụ chi phối. inline đã trở thành yêu cầu đơn giản đối với inline. Với always_inline, trình biên dịch vẫn có thể bảo lưu quyền không inline chức năng (vì lý do rõ ràng). Tuy nhiên, nó cũng nói "tin tưởng tôi, tôi muốn điều này inlined - trình biên dịch, nội tuyến này nếu có thể". Thuộc tính này khôi phục một số khả năng nội tuyến cho lập trình viên. Điều này có thể được sử dụng để thực hiện, nhưng tôi nghi ngờ (trong trường hợp này) rằng nó có nhiều hơn để làm với giảm số lượng các chức năng xuất khẩu tư nhân, chứ không phải là yêu cầu hiệu suất.

nên NS_INLINE luôn được sử dụng thay vì inline tĩnh trong các dự án mục tiêu-c?

No. __attribute__((always_inline)) nên dành riêng cho những người đã có nhiều kinh nghiệm về tối ưu hóa chương trình và sử dụng cơ sở này. Thuộc tính này có thể được áp dụng cho các hàm C, các phương thức C++ và các cuộc gọi tĩnh khác. Nó không thể được áp dụng cho lớp ObjC hoặc các phương thức cá thể (mà là động). Tôi đề cập rằng vì trình biên dịch, trình tối ưu hóa và LTO rất giỏi về những gì họ làm. Trong khi đó, việc sử dụng nội tuyến không đúng cách có thể có (một trong số) một số hình phạt về hiệu suất. Ngoại lệ (đối với những người không dành thời gian tối ưu hóa đáng kể) là tất nhiên khi người ta dành thời gian để đo lường sự khác biệt của nó.

+0

Cảm ơn, rất sâu! Tôi đã cập nhật câu hỏi của tôi slights để làm cho nó rõ ràng rằng tôi đang nói về c chức năng trong một mục tiêu-c dự án. – keegan3d

+3

@ keegan3d bạn được chào đón. trên thực tế, tôi cho rằng bạn đã áp dụng nó vào đúng biểu tượng. tôi đã đề cập các phương pháp objc như một lưu ý phụ (ví dụ: đối với bất kỳ người đọc nào). tuy nhiên, điểm lớn hơn mà tôi * cố gắng tạo ra là có các trình tối ưu hóa tốt trong chuỗi công cụ và các tiến bộ tối ưu trong tương lai (ví dụ: LTO của clang) cho phép tối ưu hóa rất tích cực của nhiều biểu tượng C và C++ - ngay cả khi các định nghĩa không hiển thị cho trình biên dịch.những tiến bộ này làm tăng thêm độ khó của việc điều chỉnh tay thành công (ví dụ: sử dụng '__attribute __ ((always_inline))'). – justin

+0

Điều gì về macro 'FOUNDATION_STATIC_INLINE' mới? Nó chỉ được định nghĩa là 'static __inline__'. Tôi có thể sử dụng điều đó, tức là, 'tĩnh __inline__' giống như' static inline'? – ma11hew28