2013-04-23 38 views
6

Sự khác nhau giữa hai loại là gì? Tôi biết rằng int32_t là chính xác 32 bit bất kể môi trường nhưng, như tên của nó cho thấy rằng nó nhanh, bao nhiêu nhanh hơn có thể int_fast32_t thực sự được so sánh với int32_t? Và nếu nó nhanh hơn đáng kể, thì tại sao vậy?Sự khác nhau giữa int32_t và int_fast32_t

+16

Tốc độ nhanh hơn khoảng 50% đến 80%. Nó thực sự là một loại khá nhanh. Trong thực tế nó nhanh đến nỗi nó biến hầu hết các thuật toán O (N) thành O (N/2). –

+4

'int_fast32_t' là loại số nguyên có dấu * nhanh nhất có sẵn với * ít nhất * 32 bit. – Maroun

+4

@Kerrek, bạn thực sự nên đặt mặt cười ở phần cuối của sự hài hước vì một số linh hồn nghèo không nghi ngờ lấy nó như phúc âm :-) – paxdiablo

Trả lời

17

C được xác định theo một máy trừu tượng hóa lý tưởng. Nhưng phần cứng trong thế giới thực có những đặc điểm hành vi không bị bắt bởi tiêu chuẩn ngôn ngữ. Các loại _fast là loại bí danh cho phép mỗi nền tảng chỉ định các loại "thuận tiện" cho phần cứng. Ví dụ, nếu bạn có một mảng số nguyên 8 bit và muốn biến đổi từng số một, điều này sẽ không hiệu quả trên các máy tính để bàn hiện đại, vì các hoạt động tải của chúng thường muốn điền vào toàn bộ thanh ghi bộ xử lý. hoặc rộng 32 hoặc 64 bit (một "từ máy"). Vì vậy, rất nhiều dữ liệu được tải sẽ bị lãng phí, và quan trọng hơn, bạn không thể song song việc nạp và lưu trữ hai phần tử mảng lân cận, bởi vì chúng sống trong cùng một từ máy và do đó cần phải được tải-sửa đổi-lưu trữ tuần tự.

Các loại _fast thường rộng bằng từ máy, nếu điều đó khả thi. Tức là, chúng có thể là rộng hơn so với nhu cầu của bạn và do đó tiêu thụ nhiều bộ nhớ hơn (và do đó khó nhớ hơn), nhưng phần cứng của bạn có thể truy cập chúng nhanh hơn. Tất cả phụ thuộc vào mẫu sử dụng, mặc dù. (Ví dụ: một mảng int_fast8_t có lẽ sẽ là một mảng từ máy và vòng lặp chặt chẽ sửa đổi một mảng như vậy cũng có thể được hưởng lợi đáng kể.)

Cách duy nhất để tìm hiểu xem liệu có khác biệt gì không!

+0

tại sao bạn lại nói về C++? –

+0

@JensGustedt: Không có thói quen. Đã sửa! –

+0

Bạn đã giải thích khá rõ. Cảm ơn :) –

8

int32_t là một số nguyên chính xác là 32 bit. Nó rất hữu ích nếu bạn muốn ví dụ để tạo ra một cấu trúc với một vị trí bộ nhớ chính xác.

int_fast32_t là số nguyên "nhanh nhất" cho bộ xử lý hiện tại của bạn lớn hơn hoặc bằng int32_t. Tôi không biết nếu có thực sự là một lợi ích cho bộ xử lý hiện tại (x86 hoặc ARM)

Nhưng tôi có thể phác thảo cuối cùng một trường hợp thực tế: Tôi đã từng làm việc với bộ xử lý PowerPC 32 bit. Khi truy cập 16bits sai lệch int16_t, nó không hiệu quả vì trước tiên phải sắp xếp lại chúng trong một trong số 32bits đăng ký của nó. Đối với dữ liệu không được ánh xạ bộ nhớ, vì chúng tôi không có giới hạn bộ nhớ, việc sử dụng int_fast16_t hiệu quả hơn (thực tế là 32 bit int).

+0

Tôi không nghĩ rằng câu trả lời đặt một điểm đáng chú ý trong báo giá Tiến sĩ Ác là rất hữu ích ... những gì "nhanh nhất" có nghĩa là *? –

+0

@KerrekSB: Tiêu chuẩn chỉ nói "nhanh nhất", với chú thích "Loại được chỉ định không được đảm bảo nhanh nhất cho mọi mục đích, nếu việc triển khai không có cơ sở rõ ràng để chọn một loại khác, nó sẽ đơn giản chọn một số loại nguyên đáp ứng các yêu cầu về ký và chiều rộng . " Vì vậy, tôi nghĩ rằng các báo giá là khá thích hợp, vì mỗi người thực hiện tự do quyết định cho mình cách đo lường "tốc độ". 'int_fast32_t' có thể dễ dàng là 32 bit khi thực thi 64 bit. –

+0

Xin lỗi, một cuộc họp đã gián đoạn việc viết câu trả lời của tôi. Nó bây giờ là hoàn thành với một - hy vọng - enlightening ví dụ. – Offirmo

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