Có lẽ hiệu suất? Tôi cảm thấy rằng việc sử dụng các số nguyên không cố định chỉ làm cho các chương trình phức tạp hơn và dễ bị thất bại khi chuyển sang một kiến trúc khác.Có lợi thế nào khi sử dụng các số nguyên không cố định (int, long) thay vì các số nguyên cố định (int64_t, int32_t) không?
Trả lời
std::intN_t
được cung cấp only if the implementation can directly support them. Vì vậy, mã porting sử dụng chúng có thể thất bại.
Tôi thích std::intfastN_t
để sử dụng phổ biến vì chúng có ít hạn chế hơn và phải nhanh hoặc nhanh hơn như int
.
Ngoài ra, hầu hết các mã C++ sử dụng int
ở khắp mọi nơi, do đó bạn có thể chạy vào weirdness khuyến mãi khi đi qua một std::int32_t
vào một chức năng chấp nhận một int
, đặc biệt là nếu sizeof(int)
là chỉ có 16 bit.
Nhiều API chấp nhận hoặc trả về giá trị của các loại không cố định. Ví dụ: các bộ mô tả tệp có loại int
, kích thước hoặc kích thước tệp là loại off_t
và strtol()
trả về một long
. Chuyển đổi một cách mù quáng các giá trị như vậy từ hoặc sang các loại kích thước cố định có thể gây tràn trên một số máy.
Các loại chiều rộng được đảm bảo (intN_t
) chỉ là kiểu chữ cho các loại số nguyên 'chuẩn' thích hợp. Nếu một nền tảng không có một kiểu thích hợp (ví dụ, nó sử dụng các số nguyên 36 bit), thì nó không thể và không được cung cấp các typedef có độ rộng đảm bảo. Điều này có nghĩa là hiệu suất khó có thể là một đối số.
Nguyên tắc chung cho tính di động tối đa (theo khía cạnh này) là sử dụng loại nguyên bản 'chuẩn' theo mặc định và các loại chiều rộng được đảm bảo chỉ khi thuật toán của bạn yêu cầu số bit chính xác. Các loại số nguyên 'chuẩn' phải được giả định chỉ rộng như được đảm bảo bởi các tiêu chuẩn có liên quan (Nếu bạn chỉ xem tiêu chuẩn C++, đó là: 8-bit char
, 16-bit int
, 32-bit long
và , nếu trình biên dịch của bạn hỗ trợ nó, 64-bit long long
).
Nếu bạn có dữ liệu có kích thước loại của bạn rất quan trọng đối với chức năng của nó, thì bạn nên sử dụng các loại có kích thước được xác định. Tuy nhiên, ví dụ một đoạn mã nằm trong phạm vi [những gì bạn có thể mong đợi hợp lý] phạm vi int (ví dụ: 1 ... vòng lặp 1000), không có lý do gì để sử dụng int_32t chỉ vì bạn muốn xác định rằng biến của bạn . Nó sẽ hoạt động tốt với một số nguyên 16, 32, 64, 36, 18 hoặc 49 bit, tất cả đều giống nhau. Vì vậy, hãy để trình biên dịch chọn kích thước tốt nhất.
Có khả năng trình biên dịch tạo mã tồi tệ hơn cho các số nguyên kích thước cố định không phải là "lựa chọn tốt nhất" cho kiến trúc.
Rõ ràng, mọi dữ liệu được trình bày qua mạng hoặc trong tệp cần phải có kích thước cố định. Tương tự như vậy, nếu bạn có giao diện yêu cầu khả năng tương thích nhị phân trên ranh giới giao diện, thì việc sử dụng các loại kích thước được xác định là rất hữu ích để tránh kích thước do vấn đề.
Tôi thấy rằng kích thước chính xác rất hiếm khi quan trọng trong mã của tôi - trong những trường hợp đó, việc sử dụng số nguyên có kích thước cố định chỉ bổ sung cruft và giảm tính di động. Bạn đang làm gì đòi hỏi bạn phải biết kích thước bit? – delnan
Tôi nghĩ rằng nó đi xuống đến các giả định mà bạn muốn thực hiện. Bạn có muốn giả sử rằng một giá trị cụ thể sẽ luôn có số bit chính xác trên bất kỳ kiến trúc nào không? Nếu vậy, một số nguyên có kích thước cố định có thể là lựa chọn đúng. Nếu không, thì bạn có thể chỉ muốn sử dụng một loại đảm bảo số bit tối thiểu nhất định. –