2010-07-27 47 views
5

thể trùng lặp:
When to use std::size_t?C++, phương pháp hay nhất, int hoặc size_t?

hello.

Giả sử các mẫu sử dụng giống nhau (nghĩa là không có số âm), nên sử dụng cho các chỉ mục khác nhau, int hoặc size_t loại?

Có sự khác biệt về hiệu suất trong trải nghiệm của bạn trên Intel 64 bit giữa hai thiết bị không?

Cảm ơn bạn

+0

@Cha cảm ơn bạn, tôi không tìm thấy bài đăng này trước đây. – Anycorn

Trả lời

1

Các loại không khác nhau theo nghĩa bạn đang ngụ ý, và nói chung int là 32bits, và size_t là chiều rộng của từ nền tảng (32-64 bit). Tôi khuyên bạn nên sử dụng size_t khi xử lý các tệp, bộ đệm và bất kỳ thứ gì khác có thể mô tả khu vực bộ nhớ hoặc bộ đệm.

Ngoài ra, bạn nên lưu ý rằng int được ký, trong khi size_t thì không.

Cuối cùng, int đã được sử dụng trước đây khi sử dụng size_t ngay bây giờ. Tuy nhiên int vẫn hữu ích vì nó là quyền riêng cho các mục đích khác.

+0

cảm ơn. Tôi đang cố gắng chuẩn hóa trong dự án của mình theo loại cụ thể, để tăng cường giao diện chủ yếu, mà còn để loại bỏ cảnh báo trình biên dịch. – Anycorn

1

size_t hoặc ptrdiff_t. int có thể không đủ để truy cập vào tất cả các phần tử của một mảng.

+1

@ dan04, rất khó có khả năng int sẽ không đủ. Quan trọng hơn là các thùng chứa tiêu chuẩn sử dụng size_t, và vì int được ký trong khi size_t là unsigned, bạn có thể nhận được các tình huống so sánh giữa các kiểu đã ký và unsigned. –

+0

@Michael Aaron Safyan: Hoàn toàn ngược lại, 'int' về cơ bản được đảm bảo là không đủ trong trường hợp chung, vì nó được * ký *, tức là nó lãng phí một chút cho dấu. – AnT

+0

@AndreyT, về lý thuyết, có, nhưng trong thực tế, khi nào bạn thực sự có một mảng có kích thước được tải vào RAM? Nếu bạn có nhiều dữ liệu trong RAM, có thể có vấn đề gì đó với thiết kế của bạn (có thể bạn đang truyền dữ liệu và sử dụng trình vòng lặp) hoặc bạn nên lo lắng về loại ... nhưng đối với hầu hết các tình huống thực tế, bạn sẽ xử lý các mảng nhỏ hơn nhiều. –

5

Tùy thuộc vào những gì bạn đang làm. Nếu bạn đang iterating trên một vector, sau đó sử dụng std :: size_t:

for (std::size_t i = 0; i < vec.size(); i++) { 
    // do something with vec[i] 
} 

Tuy nhiên, hãy cẩn thận của mã hóa các lỗi như:

for (std::size_t i = 99; i >= 0; i--) { 
    // This is an infinite loop 
} 

Nếu bạn chỉ làm một vòng lặp, bạn có thể muốn chỉ sử dụng một int đơn giản vì tình hình trên. Không nên có sự khác biệt hiệu suất giữa việc sử dụng int và std :: size_t. Nếu bạn cần một kích thước chính xác, thì bạn nên sử dụng cả int và size_t, mà là các kiểu được định nghĩa trong stdint.h.

+2

Bạn đang lặp qua một 'std :: vector <>' (hoặc bất kỳ vùng chứa tiêu chuẩn nào khác), bạn có thể muốn sử dụng 'std :: vector <> :: size_type' thay vì rút gọn trực tiếp thành' std :: size_t'. – AnT

+0

@AndreyT, nếu người ta lo ngại về tính tổng quát, thì người ta thực sự nên sử dụng các trình vòng lặp. Nếu một là whipping lên một chức năng nhanh chóng mà iterates trên một vector, sau đó không có gì để đạt được từ nhiều tiết std :: vector :: size_type thay cho std :: size_t. –

+0

Tôi có thể thiếu cái gì đó ở đây nhưng tại sao lại là vô hạn vòng lặp thứ hai? –

11

size_t là loại sẽ được sử dụng để lập chỉ mục mảng khi bạn làm việc với một mảng tương đối chung. I E. khi bạn chỉ có một mảng trừu tượng char s, int s hoặc một cái gì đó khác.

Khi bạn đang làm việc với mảng cụ thể, tức là một mảng chứa một số thành phần cụ thể cho ứng dụng của bạn, bạn thường phải có "loại lựa chọn" để đếm hoặc lập chỉ mục các thực thể thuộc loại đó ứng dụng. Đó là loại bạn nên sử dụng. Ví dụ, nếu một số mảng chứa các bản ghi cho nhân viên của công ty, thì bạn đã có một "kiểu lựa chọn" trong chương trình mà bạn sử dụng để chỉ định "số lượng nhân viên". Đó là loại bạn nên sử dụng để lập chỉ mục mảng các bản ghi nhân viên. Nó có thể là unsigned int, có thể là employee_count_t hoặc một cái gì đó tương tự. Sử dụng naked size_t cho mục đích đó là lỗi thiết kế.

Cũng lưu ý rằng, size_t là loại không ngay lập tức dành cho lập chỉ mục mảng. Nó là một kiểu nhằm biểu diễn kích thước của đối tượng lớn nhất trong chương trình. Nó "hoạt động" đối với mảng bởi transitivity: mảng là các đối tượng, do đó size_t luôn đủ để lập chỉ mục một mảng. Tuy nhiên, khi bạn thiết kế một chương trình có ý nghĩa hơn khi nghĩ về các hộp chứa chung , thay vì suy nghĩ về các mảng cụ thể. Hôm nay nó có thể là một mảng, ngày mai bạn có thể phải chuyển sang một danh sách liên kết hoặc một cây thay thế. Trong trường hợp chung, phạm vi của size_t không đủ để biểu thị số phần tử trong vùng chứa trừu tượng, đó là lý do tại sao size_t trong trường hợp này không phải là một lựa chọn tốt.

+2

@AndreyT, nếu ngày mai nó có thể là một danh sách liên kết hoặc cây, sau đó một chỉ mục của bất kỳ loại ở tất cả là không tốt. Đối với điều đó, bạn cần vòng lặp. –

+0

@Michael Aaron Safyan: Không nhất thiết. Có thể xây dựng một mảng phân đoạn của một số loại, mà khái niệm chỉ mục vẫn có ý nghĩa, và tuy nhiên không bị giới hạn bởi kích thước tối đa của khối bộ nhớ liên tục. – AnT

+1

@AndreyT, nhưng các danh sách được liên kết không hỗ trợ truy cập ngẫu nhiên ... điều này rất khó khăn và có khả năng sẽ có hiệu suất rất kém. Giải pháp chung nhất là sử dụng trình vòng lặp hoặc khách truy cập. Chỉ số chỉ có ý nghĩa đối với vùng chứa truy cập ngẫu nhiên. –

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