2013-09-11 16 views
9

Bây giờ có một chiếc iPhone đi kèm với kiến ​​trúc 64-bit. long trở thành 64 bit (trong khi int vẫn 32-bit), và ở khắp mọi nơi NSInteger đã được sử dụng hiện nay là một long và vì vậy 64-bit không 32. Và twitter đã khá một vài người nói "Tôi rất vui vì tôi đã sử dụng ở khắp mọi nơi NSInteger không phải int ".NSInteger có thực sự được sử dụng ở mọi nơi không?

Nếu bạn cần lưu trữ một giá trị không vượt quá 32 bit (ví dụ trong vòng lặp chỉ lặp lại 25 lần), tại sao nên sử dụng lâu dài, vì 32 bit trên (ít nhất) sẽ trống rỗng.

Nếu chương trình đã làm việc trên các số nguyên 32-bit, sau đó điều gì lợi ích không sử dụng 64-bit cho số nguyên cung cấp, khi nó sử dụng bộ nhớ nhiều hơn?

Cũng sẽ có những tình huống mà sử dụng một số nguyên 64-bit mang lại cho một kết quả khác nhau để sử dụng một số nguyên 32-bit. Vì vậy, nếu bạn sử dụng NSInteger thì một cái gì đó có thể hoạt động trên iPhone 5S nhưng không hoạt động trên một thiết bị cũ, trong khi nếu int hoặc dài được sử dụng một cách rõ ràng thì kết quả sẽ giống nhau trên mọi thiết bị.

Trả lời

-1

Việc lưu trữ nội bộ cho NSInteger thể là một trong nhiều loại ủng hộ khác nhau, đó là lý do tại sao bạn có thể sử dụng nó ở khắp mọi nơi và không cần phải lo lắng về nó, đó là toàn bộ vấn đề của nó.

1

Nếu bạn cần lưu trữ giá trị không vượt quá 32 bit ... tại sao nên sử dụng lâu dài?

Nếu bạn thực sự có thể đảm bảo điều đó, thì hoàn toàn không có lý do gì để đánh giá loại 64 bit trên một bit 32 bit. Đối với các phép toán đơn giản như vòng lặp, bộ đếm và số học chung, các số nguyên 32 bit đủ. Nhưng đối với các hoạt động phức tạp hơn, đặc biệt là các yêu cầu của các ứng dụng hiệu suất cao - chẳng hạn như các ứng dụng thực hiện xử lý âm thanh hoặc hình ảnh - sự gia tăng số lượng dữ liệu mà bộ xử lý có thể xử lý ở chế độ 64 bit là đáng kể.

Nếu chương trình đã làm việc trên các số nguyên 32 bit, thì lợi ích nào sử dụng 64 bit cho số nguyên cung cấp, khi nào nó sử dụng nhiều bộ nhớ hơn?

Bạn sử dụng nhiều bộ nhớ hơn có vẻ như là điều xấu. Bằng cách tăng gấp đôi kích thước của một số kiểu dữ liệu, chúng có thể được giải quyết tới nhiều vị trí hơn trong bộ nhớ và bộ nhớ càng nhiều càng tốt, thời gian hệ điều hành tải mã càng ít. Bên cạnh đó, có gấp đôi số lượng làn đường cho dữ liệu trong một chiếc xe buýt vi xử lý tương đương với một trật tự của độ lớn hơn giá trị có thể được xử lý trong một đi duy nhất, và sự gia tăng kích thước đăng ký nghĩa theo độ nhiều dữ liệu có thể được giữ xung quanh trong một đăng ký. Điều này tương đương với, trong điều kiện đơn giản nhất, gần như gấp đôi tốc độ của hầu hết các ứng dụng.

Ngoài ra, sẽ có trường hợp khi sử dụng số nguyên 64 bit cho kết quả khác nhau khi sử dụng số nguyên 32 bit? ...

Có, nhưng không theo cách bạn nghĩ. Các kiểu dữ liệu 32 bit và các hoạt động cũng như các hoạt động 64 bit (được mô phỏng nhiều nhất trong phần mềm, hoặc bằng phần cứng hoặc opcodes đặc biệt trong các máy chủ 32 bit) là "tương đối ổn định" về kích thước của chúng. Bạn không thể thực hiện gần như nhiều bảo đảm trên kiến ​​trúc 64 bit vì các trình biên dịch khác nhau thực hiện các phiên bản khác nhau của các kiểu dữ liệu 64 bit (xem LP64, SILP64, and LLP64). Thực tế, điều này có nghĩa đúc một loại 64 bit cho một loại 32-bit - nói một con trỏ đến một int - đảm bảo sẽ dẫn đến mất thông tin, nhưng đúc giữa hai loại dữ liệu mà có bảo đảm là 64 bit - một con trỏ và dài trên LP64 - là chấp nhận được. ARM thường được biên dịch bằng cách sử dụng LP64 (tất cả các int là 32-bit, tất cả các thời gian dài là 64-bit).Một lần nữa, hầu hết các nhà phát triển không nên bị ảnh hưởng bởi switch, nhưng khi bạn bắt đầu xử lý các số lớn tùy ý mà bạn cố gắng lưu trữ trong các số nguyên, thì độ chính xác sẽ trở thành một vấn đề.

Vì lý do đó, tôi khuyên bạn nên sử dụng NSUInteger và NSInteger trong giao diện công cộng và API nơi không có kiểm soát giới hạn cố định hoặc bảo vệ tràn. Ví dụ, một TableView yêu cầu một lượng dữ liệu NSUInteger không phải vì nó lo lắng về cấu trúc dữ liệu 32 và 64 bit, nhưng bởi vì nó có thể không đảm bảo về kiến ​​trúc mà nó được biên dịch. Nỗ lực của Apple để tạo ra các kiểu dữ liệu độc lập về kiến ​​trúc thực sự là một chút xa xỉ, xem xét ít công việc bạn phải làm để lấy mã của bạn để biên dịch và "chỉ làm việc" trong cả hai kiến ​​trúc.

+1

Câu trả lời thứ hai "bạn sử dụng nhiều bộ nhớ hơn có vẻ như một điều xấu" chính xác là loại câu trả lời tôi đang tìm kiếm. Thật không may, vì tôi không có một nền tảng khoa học máy tính, nó đi thuyền hoàn toàn trên đầu tôi. Có một ví dụ bạn có thể cho thấy rằng làm thế nào lưu trữ số "3" trong một không gian 64-bit thực sự tăng tốc độ ứng dụng? Tôi đồng ý với Jonathan rằng nó chỉ có vẻ như một sự lãng phí rất lớn của không gian và khủng khiếp không hiệu quả. –

+0

Đó là tất cả cùng lệnh 'MOV'. Nó không phải là các hoạt động nhỏ tùy ý gây ra sự tăng tốc, đó là lượng dữ liệu có thể chạy dọc theo các bus của bộ xử lý tạo nên sự khác biệt. Đó là giống như có một đường cao tốc 4 làn thay vì chỉ 2, sau đó cố gắng để tổ chức một cuộc đua xe tải quái vật. Bạn có thể phù hợp với nhiều dữ liệu nhỏ hơn (như xe hơi bình thường), và vắt trong những xe tải lớn mà không cần phải nghỉ mát để cắt dữ liệu lên và chạy nó theo thứ tự. – CodaFi

+1

Ah tốt, tương tự. Tôi thích nó. Vì vậy, bằng cách sử dụng tương tự của bạn, không phải là sử dụng một 'dài 'cho một số lượng nhỏ một chút giống như lái xe một chiếc xe buýt lớn với chỉ 1 đứa trẻ nhỏ bị bỏ rơi ở phía sau? Nó chiếm cùng một không gian như một chiếc xe buýt đóng gói, nhưng không gian thêm đó bị lãng phí. (Suy nghĩ thứ hai, có lẽ phép ẩn dụ đó làm tôi bối rối.) Tôi cảm thấy mình không nắm bắt được thứ gì đó thực sự cơ bản, nhưng có vẻ như ngay cả khi đó là lệnh 'MOV',' MOV' một giá trị được lưu trữ trong 64 -bit không gian sẽ mất hai lần miễn là một trong những lưu trữ trong một không gian 32-bit? –

-1

Apple sẽ chăm sóc khả năng tương thích ngược nếu ứng dụng của bạn đang chạy trên động cơ 32 bit hoặc 64 bit và sẽ chuyển biến của bạn sau hậu trường sang loại dữ liệu thích hợp sử dụng macro __LP64__.

#if __LP64__ 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 
+2

đây là toàn bộ điểm của câu hỏi của tôi ... –

+0

NSInteger cung cấp cho bạn luôn loại dữ liệu số nguyên lớn nhất có thể truy cập được trong HĐH của bạn - trước và sau iOS7. Và macro này chỉ chăm sóc cho phiên bản hệ điều hành của bạn. Bạn luôn được khuyến khích sử dụng loại dữ liệu "nhỏ nhất" có ý nghĩa cho vấn đề cụ thể của bạn. Bạn chắc chắn 'có thể' lưu trữ một boolean trong một số nguyên 32 bit cũng trong một bit 64 - trước và sau iOS7. – XcodeJunkie

Các vấn đề liên quan