2012-07-27 43 views
6

Trong C++, có lợi ích gì khi sử dụng lâu trên int không? Có vẻ như đó là kích thước từ mặc định cho kiến ​​trúc x86 và x86_64 (32 bit trên x86 và 64 bit trên x86_64, trong khi int là 32 bit trên cả hai), nên (về mặt lý thuyết) sẽ nhanh hơn khi thực hiện phép tính số học.C++ int so với dài

Chuẩn C++ đảm bảo rằng sizeof (int) < = sizeof (dài), nhưng có vẻ như dài là kích thước mặc định trên cả hệ thống 32 bit và 64 bit, vì vậy nên sử dụng lâu thay vì int nếu có thể khi cố viết mã có thể di chuyển trên cả hai kiến ​​trúc?

+1

Trên Windows, 'long' là 32 bit. Trên Linux, 'long' là 64 bit. Điều đó phá vỡ rất nhiều ứng dụng. – Mysticial

+0

Liên quan: [Sự khác biệt giữa một int và một dài trong C++ là gì?] (Http://stackoverflow.com/q/271076/11343) – CharlesB

Trả lời

1

Điều gì là nhanh hơn và những gì không phải là điều gì đó đang trở nên khó dự đoán mỗi ngày. Lý do là bộ vi xử lý không còn đơn giản và với tất cả các động lực phức tạp và thuật toán đằng sau chúng tốc độ cuối cùng có thể tuân theo các quy tắc hoàn toàn phản trực giác.

Cách duy nhất là chỉ đo lường và quyết định. Cũng lưu ý rằng những gì là nhanh hơn phụ thuộc vào các chi tiết nhỏ và thậm chí cho CPU tương thích một tối ưu hóa cho một có thể là một bi quan cho người kia là gì. Đối với các phần rất quan trọng, một số phần mềm chỉ cố gắng và kiểm tra thời gian cho các cách tiếp cận khác nhau tại thời gian chạy trong khi khởi tạo chương trình.

Điều đó nói rằng, như quy tắc chung, số nguyên nhanh hơn bạn có thể có là int. Bạn chỉ nên sử dụng các số nguyên khác nếu cần chúng một cách cụ thể (ví dụ: nếu long lớn hơn và bạn cần độ chính xác cao hơn hoặc nếu short nhỏ hơn nhưng đủ và bạn cần phải tiết kiệm bộ nhớ).

Thậm chí tốt hơn nếu bạn cần kích thước cụ thể, sau đó sử dụng loại tiêu chuẩn cố định hoặc thêm typedef thay vì chỉ rắc khoảng long nơi bạn cần. Bằng cách này nó sẽ được dễ dàng hơn để hỗ trợ các trình biên dịch và kiến ​​trúc khác nhau và cũng có ý định sẽ rõ ràng hơn cho bất cứ ai sẽ đọc mã trong tương lai.

5

long được đảm bảo tối thiểu là 32 bit trong khi int chỉ đảm bảo có ít nhất 16 bit. Khi viết một chương trình hoàn toàn di động, bạn có thể sử dụng long nơi kích thước được đảm bảo của int không đủ cho nhu cầu của bạn.

Trong thực tế, mặc dù, nhiều người đưa ra giả thiết ngầm rằng int lớn hơn mức đảm bảo tiêu chuẩn vì chúng chỉ nhắm mục tiêu các nền tảng như vậy. Trong những tình huống này, nó thường không quan trọng lắm.

int phải là kích thước "tự nhiên" của một số cho hệ thống; trong lý thuyết long có thể đắt hơn nhưng trên nhiều hoạt động kiến ​​trúc trên long không đắt hơn ngay cả khi long thực sự dài hơn int.

4

Nếu bạn cần các loại số nguyên sẽ vẫn có cùng kích thước trên các nền tảng khác nhau, bạn muốn các loại trong <stdint.h>.

Ví dụ: nếu bạn hoàn toàn cần số nguyên không dấu 32 bit, bạn muốn uint32_t. Nếu bạn hoàn toàn cần một số nguyên có ký hiệu 64 bit, bạn muốn int64_t.

+0

Đồng ý. Nhưng hãy sử dụng các loại 'xintX_t' càng ít càng tốt.Chúng có thể tác động đến hiệu suất nghiêm trọng nếu mã được chuyển sang một kiến ​​trúc CPU ít được tha thứ hơn. – wallyk

+0

@wallyk: Tất nhiên mã đang bị lỗi do giả định về kích thước của các loại không còn bị tổn thương thực sự nhiều hơn nữa, vì vậy tôi sẽ chịu rủi ro về hiệu suất các mã lỗi (dĩ nhiên mã không nên đưa ra nhiều giả định hơn về kích thước của loại sau đó những gì được đảm bảo theo tiêu chuẩn, nhưng nó vẫn xảy ra thường xuyên) – Grizzly

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