Điều thú vị về loại "int" cơ bản là nó sẽ luôn luôn là loại số nguyên nhanh nhất cho bất kỳ nền tảng nào bạn hiện đang biên dịch. Mặt khác, lợi thế của việc sử dụng, nói, int32_t (thay vì chỉ int) là mã của bạn có thể đếm trên một int32_t luôn luôn là 32 bit rộng không có vấn đề gì nền tảng nó được biên dịch trên, có nghĩa là bạn có thể một cách an toàn đưa ra nhiều giả định về hành vi của giá trị hơn là bạn có thể với một int. Với các loại kích thước cố định, nếu mã của bạn biên dịch hoàn toàn trên nền tảng Y mới, thì có nhiều khả năng ứng xử giống hệt như trên nền tảng cũ X.
(lý thuyết) bất lợi của int32_t là nền tảng X mới có thể không hỗ trợ các số nguyên 32 bit (trong trường hợp đó mã của bạn sẽ không biên dịch ở tất cả trên nền tảng đó), hoặc nó có thể hỗ trợ chúng nhưng xử lý chúng chậm hơn nó sẽ xử lý các int cũ.
Các ví dụ trên có một chút khó khăn, vì hầu như tất cả phần cứng hiện đại xử lý các số nguyên 32 bit ở tốc độ tối đa, nhưng có (và làm) tồn tại nền tảng nơi thao tác int64_ts chậm hơn thao tác int, vì (a) CPU có các thanh ghi 32 bit, và do đó phải chia từng hoạt động thành nhiều bước, và dĩ nhiên (b) một số nguyên 64 bit sẽ chiếm gấp đôi bộ nhớ làm số nguyên 32 bit, có thể gây thêm áp lực lên bộ đệm . Tuy nhiên, hãy nhớ rằng 99% phần mềm mọi người viết, vấn đề này sẽ không có bất kỳ hiệu ứng quan sát nào về hiệu suất, đơn giản vì 99% phần mềm không có CPU bị ràng buộc trong những ngày này, và ngay cả đối với mã có nghĩa là, nó không chắc rằng chiều rộng số nguyên sẽ là vấn đề hiệu suất lớn. Vì vậy, những gì nó thực sự đi xuống là, làm thế nào để bạn muốn toán số nguyên của bạn để hành xử?
Nếu bạn muốn trình biên dịch để đảm bảo rằng giá trị số nguyên của bạn luôn chiếm 32 bit RAM, và sẽ luôn luôn "quấn quanh" tại 2^31 (hoặc 2^32 cho unsigned), không có vấn đề bạn đang biên dịch nền tảng nào, đi với int32_t (v.v.).
Nếu bạn không thực sự quan tâm đến hành vi gói (vì bạn biết các số nguyên của bạn sẽ không bao giờ được bọc, do tính chất của dữ liệu mà chúng đang lưu trữ) và bạn muốn làm cho mã di động hơn một chút mục tiêu biên dịch kỳ lạ/bất thường, và ít nhất về mặt lý thuyết nhanh hơn (mặc dù có lẽ không phải trong cuộc sống thực), thì bạn có thể gắn bó với đồng bằng cũ ngắn/int/dài.
Cá nhân tôi sử dụng các loại kích thước cố định (int32_t, vv) theo mặc định, trừ khi có một lý do rất rõ ràng không, bởi vì tôi muốn giảm thiểu số lượng hành vi biến trên nhiều nền tảng. Ví dụ, đoạn mã này:
for (uint32_t i=0; i<4000000000; i++) foo();
... sẽ luôn luôn gọi foo() chính xác 4000000000 lần, trong khi mã này:
for (unsigned int i=0; i<4000000000; i++) foo();
sức gọi foo() 4000000000 lần, hoặc nó có thể đi vào một vòng lặp vô hạn, tùy thuộc vào việc (sizeof (int)> = 4) hay không. Chắc chắn sẽ có thể xác minh rằng đoạn mã thứ hai không làm điều đó trên bất kỳ nền tảng nhất định nào, nhưng do sự khác biệt hiệu suất có khả năng giữa hai kiểu, tôi thích cách tiếp cận đầu tiên kể từ khi dự đoán hành vi của nó là không có trí tuệ. Tôi nghĩ rằng cách tiếp cận char/short/int/long hữu ích hơn trong những ngày đầu của C, khi kiến trúc máy tính đa dạng hơn, và CPU đủ chậm để đạt được hiệu năng gốc hoàn toàn quan trọng hơn mã hóa an toàn.
Miễn là chúng di động bằng hoặc nhiều hơn các lựa chọn thay thế, tôi sẽ tưởng tượng có * không phải là một mặt khác ngoài việc đảm bảo bạn thiết kế nó rất tốt ngay từ đầu để sau đó bạn không không phải thay đổi loại hoặc mã của bạn. Nhược điểm duy nhất có thể là một số nguyên 32 bit (i32b hoặc bất cứ điều gì) có thể chiếm gấp đôi không gian như là một 'int' là cần thiết quá. Nhưng, tôi muốn biết các loại dữ liệu của mình lớn đến mức nào, vì vậy tôi không thấy đó là một nhược điểm. Nếu tôi muốn> = 16 bit, tôi sẽ sử dụng> = 16 bit, chứ không phải 32. Ngoài ra, bạn đã thấy stdint.h chưa? Có vẻ như bạn đang sáng tạo lại. – Corbin
Không có? –
Mehrdad
Ah, thực sự tôi đã bỏ lỡ một nhược điểm thực sự rõ ràng. Không tương thích với mã của người khác. Tôi sẽ tưởng tượng rằng int32b của bạn hoặc bất cứ điều gì gần như luôn luôn sẽ tương thích hoàn toàn với một 'int', nhưng có thể có trường hợp nó sẽ không được (và do đó không nên được giả định). – Corbin