2013-04-05 42 views
16

This answer đi kèm với một tuyên bố thú vị - "trên các máy nơi int* nhỏ hơn một char*". (hãy loại trừ các con trỏ đến các hàm)Con trỏ có thể có kích thước khác nhau không?

Có thể cho các con trỏ đến các loại khác nhau có kích thước khác nhau không? Tại sao điều này lại hữu ích?

+3

Điều này có thể hữu ích: http://stackoverflow.com/questions/12006854/why-the-size-of-a-pointer-to-a-function-is-different-from-the-size-of- một con trỏ –

+2

@KirilKirov thật thú vị (tôi đoán tôi đã loại trừ ngay lập tức con trỏ hàm khỏi con đường suy nghĩ của mình). Thông tin tốt! –

+1

@KirilKirov Tôi đã đủ lười để không kiểm tra liên kết của bạn, nhưng có vẻ như sau tất cả, câu trả lời của tôi là dư thừa.- –

Trả lời

14

Có, điều đó hoàn toàn có thể. Trên một số máy, một con trỏ tới một byte chứa hai giá trị: Một con trỏ tới địa chỉ WORD của từ bộ nhớ chứa byte và một "chỉ số byte" cung cấp vị trí của byte trong từ. Ví dụ. trên máy 32 bit, "chỉ số byte" là 0..3.

Điều này đòi hỏi nhiều không gian lưu trữ hơn "int *", chỉ là con trỏ đến từ có liên quan.

+0

Thật vậy. Người ta thậm chí có thể tưởng tượng một số loại máy lạ, nơi dữ liệu khác nhau được lưu trữ trong các ngân hàng bộ nhớ khác nhau hoàn toàn, mỗi địa chỉ theo cách riêng của họ. –

+0

Bạn có thể đặt tên cho các máy như vậy, Mats? –

+9

@MartinVidner: Tôi vừa phát minh ra một điều trong tâm trí của tôi cho bạn. –

4

Có, con trỏ không được đảm bảo có cùng kích thước, mặc dù trên hầu hết các kiến ​​trúc hiện đại, chúng thực tế.

Một điểm mà điều này có thể hữu ích là khi người ta quan tâm đến dữ liệu so với con trỏ hàm. Về mặt lịch sử, các con trỏ hàm (được sử dụng để chuyển đến một số phần nhất định trong mã thực thi ) cần được gọi là "con trỏ xa" rộng hơn con trỏ dữ liệu.

6

Trên máy được gửi địa chỉ từ, char* có thể cần chứa thông tin một phần, làm cho thông tin này lớn hơn int*.

Tiêu chuẩn cho phép điều này, không loại trừ việc triển khai trên phần cứng đó (mặc dù điều đó thậm chí còn hiếm hơn bây giờ so với khi C89 được thiết kế).

+0

Liên kết câu trả lời của bạn [ở đây] (http://stackoverflow.com/a/29035972/1708801) bạn có biết các trường hợp khác mà 'char *' có kích thước khác với 'int *' không? –

2

Tôi có thể tưởng tượng một máy có ý nghĩa khi giả định rằng bộ nhớ cần cho các mảng int sẽ ít hơn nhiều so với nhu cầu bộ nhớ cho các mảng char.

Có thể chỉ định, ví dụ, việc triển khai sẽ không sử dụng nhiều hơn 10 số nguyên được phân bổ động, nhưng có thể phân bổ nhiều mảng char. Trong trường hợp này, một byte có thể đủ cho một số int*, trong khi char* cần phải là bốn byte trở lên.

Đó là tầm nhìn lý thuyết.

+0

Hơn 256 số nguyên được phân bổ động, ngay cả khi một byte là đủ. –

+0

Tôi muốn đề cập đến 4 bit con trỏ, nhưng tôi nghĩ rằng đã được trên đầu trang :) – xtofl

5

Thẻ có nghĩa là bạn đang hỏi về C++ và việc triển khai tuân thủ của nó, chứ không phải một số máy vật lý cụ thể.

Tôi phải báo toàn bộ tiêu chuẩn để chứng minh điều đó, nhưng thực tế đơn giản là nó không đảm bảo về kết quả của sizeof(T*) cho bất kỳ T và (như một hệ quả) không đảm bảo rằng sizeof(T1*) == sizeof(T2*) cho bất kỳ T1T2).

+0

Tôi. Trong trường hợp không có cái gì khác, tôi đoán 'chỉ kích thước của char và unsigned char' được đảm bảo sẽ làm. –

+0

@LuchianGrigore: Chắc chắn, miễn là bạn đề cập đến có _are_ các hạn chế khác trên một số loại. –

+1

"Đối tượng loại cv void * có cùng yêu cầu biểu diễn và căn chỉnh như cv char *" – PlasmaHH

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