2010-06-06 30 views
5

thể trùng lặp:
When to use std::size_t?Có thực hành tốt để sử dụng std :: size_t khắp nơi không?

tôi có rất nhiều các hằng số trong mã của tôi là số unsigned, ví dụ bộ đếm, tần suất cắt, độ dài, v.v. Tôi bắt đầu sử dụng std::size_t cho tất cả những thứ này, thay vì int hoặc unsigned int.

Đó có phải là điều phù hợp để làm không? Tôi bắt đầu nó vì các container STL sử dụng nó cho các kích thước của nó, nó được sử dụng cho vị trí chuỗi, vv ..

+0

Âm thanh đó thực sự gây tranh cãi, tại sao không chỉ đi với int? –

+2

Bản sao có hiệu lực của [Khi nào sử dụng tiêu chuẩn :: size_t?] (Http://stackoverflow.com/questions/1951519/when-to-use-stdsize-t) –

+0

Xem: http://stackoverflow.com/questions/ 1951519/khi sử dụng-stdsize-t –

Trả lời

8

std::size_t là loại để sử dụng để đếm vị trí bộ nhớ, như độ dài mảng, kích thước của đối tượng, vv. sử dụng container_type::size_type, sẽ thường là bản đồ đến std::size_t, nhưng không được đảm bảo để làm như vậy.

Nếu bạn cần loại để giữ tích phân không âm không được sử dụng cho các mục đích đã đề cập ở trên, có gì sai với unsigned short, unsigned intunsigned long?

2

Bạn có thể sử dụng size_t cho các biến đại diện cho kích thước của các đối tượng được lưu trữ trong bộ nhớ. Nhưng không có nhiều lý do để sử dụng nó cho bất cứ điều gì khác. Nó tồn tại chủ yếu vì int không dấu có thể không đủ rộng để thể hiện kích thước của một đối tượng bộ nhớ. (Xem xét một kiến ​​trúc có int-bit 16 bit nhưng không gian địa chỉ 32 bit.)

3

size_t thực sự là typedef được định nghĩa trong stddef.h và phụ thuộc nền tảng, vì vậy bạn không thể đưa ra bất kỳ giả định nào về nó. Trên gcc 4.4 (i486) nó được định nghĩa là một int không dấu dài, trừ khi hệ điều hành đã định nghĩa nó, vì vậy ví dụ trên Free BSD 5 trên một máy i386 nó sẽ không được ký int trong khi trên một máy ia64 nó sẽ là một unsigned long. Vì vậy, ví dụ nếu bạn cố gắng làm một cái gì đó giống như

size_t i; 
... 
char buf[4]; 
sprintf(buf,"%u",i); 

Đôi khi nó sẽ chạy, nhưng trên một số nền tảng/trình biên dịch bạn đang gonna nhận được một lỗi tràn bộ đệm.

Điểm của tôi là điều này có thể gây ra một số vấn đề về tính di động khó chịu nếu bạn phải đưa ra giả định về kích thước/loại size_t.

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