2009-12-05 65 views
8

Tại sao nó cho bất kỳ đầu vào số nào chúng tôi thích int thay vì ngắn, ngay cả khi đầu vào là rất ít số nguyên.Cách sử dụng 'short' trong C++

Kích thước của ngắn là 2 byte trên x86 và 4 byte của tôi cho int, không nên tốt hơn và nhanh hơn để phân bổ hơn một int?

Hoặc tôi sai khi nói rằng ngắn không được sử dụng?

+0

Tuổi là một ví dụ không tốt vì nó sẽ được lưu trữ tốt hơn trong loại không dấu. Có thể ngắn hoặc int. – Toad

+1

Và thậm chí tốt hơn là để lưu trữ ngày sinh của họ. Kể từ khi một lĩnh vực tuổi phải được giữ đồng bộ – Toad

+0

Tôi đã chỉnh sửa nó, đoán rằng nên được OK ngay bây giờ :) Tôi đồng ý rằng tuổi nên được unsigned, nhưng tôi đã chỉ tìm kiếm một câu trả lời cho ngắn v/s int. – user225312

Trả lời

18

CPU thường nhanh nhất khi xử lý kích thước nguyên bản "gốc" của chúng. Vì vậy, mặc dù short có thể nhỏ hơn int, thì int có thể gần với kích thước gốc của thanh ghi trong CPU của bạn và do đó có khả năng là hiệu quả nhất trong hai.

Trong kiến ​​trúc CPU 32 bit điển hình, để tải giá trị 32 bit yêu cầu một chu kỳ xe buýt để tải tất cả các bit. Tải giá trị 16 bit yêu cầu một chu kỳ xe buýt để tải các bit, cộng với ném một nửa trong số chúng đi (thao tác này vẫn có thể xảy ra trong một chu kỳ xe buýt).

+0

Vì vậy, có * bất kỳ * trường hợp mà một đoạn ngắn có thể được sử dụng? Tôi chưa bao giờ nghĩ đến điều này cho đến ngày hôm nay, vì tôi đoán chúng ta quen với việc sử dụng int. – user225312

+8

'ngắn' có thể được sử dụng cho các định dạng tệp và giao thức mạng, nơi bạn quan tâm đến khoảng không gian bạn đang sử dụng. –

+0

vì vậy nếu tải một giá trị 16 bit cũng được thực hiện trong một chu kỳ xe buýt thì lợi ích của việc sử dụng 32 bit là bao nhiêu. – Vivek

0

Loại ngắn gọn rất hữu ích nếu bạn có một mảng lớn đầy đủ và int chỉ là cách quá lớn.

Do mảng đó đủ lớn, việc tiết kiệm bộ nhớ sẽ rất quan trọng (thay vì chỉ sử dụng một mảng int).

Mảng Unicode cũng được mã hóa trong quần short (mặc dù các phương án mã hóa khác tồn tại).

Trên thiết bị được nhúng, không gian vẫn còn quan trọng và ngắn có thể rất có lợi.

Cuối cùng nhưng không kém phần quan trọng, một số giao thức truyền dẫn khẳng định trong việc sử dụng quần short, vì vậy bạn vẫn cần chúng ở đó.

+0

Unicode không được mã hóa ngắn. Đầu tiên, bạn đang nghĩ về 'wchar_t', là một kiểu khác biệt, và thứ hai, mã hóa phổ biến nhất có lẽ là UTF-8 có kích cỡ byte. UTF16 là mặc định trên Windows, nhưng nó không phải là "mã hóa Unicode". Và cuối cùng, cũng có UTF32. – jalf

+0

Tôi đã thực sự suy nghĩ của utf16, mà trong thực tế thực sự là một đoạn ngắn, mặc dù bạn có thể đặt tên nó là wchar_t. Mã hóa này thường được sử dụng trong các biểu diễn bộ nhớ. (Như bạn đã nói các cửa sổ sử dụng nó, java sử dụng nó, vv) – Toad

+0

Các số nguyên 16 bit không được nạp với 16 bit đệm giữa chúng? –

12

Một đoạn ngắn 16 bit có ý nghĩa nếu bạn đang giữ rất nhiều trong bộ nhớ (trong một mảng lớn, ví dụ) rằng việc giảm 50% kích thước sẽ làm giảm đáng kể chi phí bộ nhớ. Chúng là không phải nhanh hơn số nguyên 32 bit trên bộ vi xử lý hiện đại, như Greg đã chỉ ra chính xác.

1

Trong các hệ thống nhúng, các kiểu dữ liệu shortunsigned short được sử dụng để truy cập các mục yêu cầu ít bit hơn số nguyên gốc. Ví dụ, nếu bộ điều khiển USB của tôi có thanh ghi 16 bit và bộ xử lý của tôi có số nguyên 32 bit, tôi sẽ sử dụng unsigned short để truy cập thanh ghi (miễn là loại dữ liệu unsigned short là 16 bit).

Hầu hết lời khuyên từ người dùng có kinh nghiệm (xem tin tức: comp.lang.C++. Được kiểm duyệt) là sử dụng kích thước nguyên gốc trừ khi sử dụng loại dữ liệu nhỏ hơn. Sự cố khi sử dụng short để tiết kiệm bộ nhớ là các giá trị có thể vượt quá giới hạn của short. Ngoài ra, điều này có thể là một hiệu suất hit trên một số bộ vi xử lý 32-bit, vì họ phải lấy 32 bit gần biến 16-bit và loại bỏ 16 bit không mong muốn.

Lời khuyên của tôi là làm việc về chất lượng chương trình của bạn trước tiên và chỉ lo lắng về việc tối ưu hóa chương trình nếu được bảo hành và bạn có thêm thời gian trong lịch biểu của mình.

+0

Tôi đã không tìm kiếm tối ưu hóa, tôi chỉ tò mò là tại sao * ngắn * không bao giờ được sử dụng. Và vì tôi không thể tìm ra bất kỳ lý do thuyết phục nào ở bất cứ nơi nào tôi nhìn, tôi nghĩ phần tối ưu hóa là vấn đề. Cảm ơn câu trả lời của bạn, btw. – user225312

1

Sử dụng loại short không đảm bảo rằng giá trị thực tế sẽ nhỏ hơn giá trị loại int. Nó cho phép để chúng nhỏ hơn và đảm bảo chúng không lớn hơn. Lưu ý rằng short phải lớn hơn hoặc bằng kích thước để nhập char.

Câu hỏi ban đầu ở trên chứa kích thước thực tế cho bộ xử lý được đề cập, nhưng khi chuyển mã sang môi trường mới, bạn chỉ có thể dựa vào các giả định yếu tương đối mà không xác minh kích thước được xác định.

Tiêu đề C <stdint.h> - hoặc, từ C++, <cstdint> - xác định loại kích thước được chỉ định, chẳng hạn như uint8_t cho loại tích phân không rõ chính xác tám bit. Sử dụng các loại này khi cố gắng tuân theo định dạng được chỉ định bên ngoài như giao thức mạng hoặc định dạng tệp nhị phân.

+0

Bạn nên đề cập đến Tom

+0

Cảm ơn bạn đã đề xuất. Tôi đã thêm một đoạn khác về chủ đề đó. – seh

+0

Tôi sẽ upvote bạn hai lần nếu tôi có thể (^: – Tom

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