2012-06-11 38 views
7

Tôi tự hỏi tại sao trong chương trình sau đây sizeof(int) trả về một giá trị khác với sizeof(int*).Tại sao sizeof (int) khác với sizeof (int *)?

Dưới đây là chương trình nhỏ:

int main(){ 
    std::cout<<sizeof(int)<<endl; 
    std::cout<<sizeof(int*)<<endl; 
    return 0; 
} 

Và đây là kết quả:

4 
8 

Đến bây giờ tôi nhớ kích thước của một con trỏ số nguyên là 4byte (trình biên dịch gcc). Làm thế nào tôi có thể kiểm tra kích thước chính xác của một con trỏ? Có phụ thuộc vào máy tính không?

Tôi đang chạy ubuntu 12,04

# lsb_release -a 

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release: 12.04 
Codename: precise 

là kích thước của con trỏ không phải là hằng số (kích thước tiêu chuẩn) 8 byte.

+7

Hệ điều hành 64 bit? – gliderkite

+1

@ ahenderson- Bạn có chắc chắn rằng tất cả các con trỏ được đảm bảo có cùng kích thước không? – templatetypedef

+0

Cũng thêm đầu ra của 'uname -a' hoặc' file ' – 0xC0000022L

Trả lời

15

Kích thước của intint* hoàn toàn là trình biên dịch và phần cứng phụ thuộc. Nếu bạn nhìn thấy tám byte được sử dụng trong một int*, bạn có thể có phần cứng 64 bit, dịch thành tám byte cho mỗi con trỏ.

Hy vọng điều này sẽ hữu ích!

+5

"Bạn có thể có hệ điều hành 64 bit". Thật vậy, nhưng quan trọng hơn, quá trình của bạn có thể là một quá trình 64-bit. :-) –

+3

Tôi muốn thêm, loại duy nhất có kích thước được xác định theo tiêu chuẩn là 'char'. 'sizeof (char)' luôn là '1' – LihO

+1

@LihO: Kích thước của' char' không thực sự được định nghĩa bởi tiêu chuẩn, nhưng 'sizeof' express là kết quả trong _số chars_. –

4

Kích thước của con trỏ là hệ thống, trình biên dịch và phụ thuộc vào kiến ​​trúc. Trên các hệ thống 32 bit, nó thường sẽ là 32 bit trong khi trên các hệ thống 64 bit, chúng thường sẽ là 64 bit.

Nếu bạn đang cố gắng lưu trữ con trỏ vào số nguyên để khôi phục sau này vào con trỏ, bạn có thể sử dụng loại intptr_t là loại tích hợp đủ lớn để giữ (tôi tin) loại con trỏ bình thường (không hoạt động) .

7

sizeof(char) == 1

Không có bảo đảm khác (*).

Trong thực tế, con trỏ sẽ có kích thước 2 trên hệ thống 16 bit, 4 trên hệ thống 32 bit và 8 trên hệ thống 64 bit.


(*) Xem nhận xét của James Kanze.

+1

nhờ tất cả :) nghi ngờ của tôi là rõ ràng – yogi

+2

'sizeof (char) <= sizeof (ngắn) <= sizeof (int) <= sizeof (dài) <= sizeof (long long)' cũng được đảm bảo. Như là 'sizeof (float) <= sizeof (double) <= sizeof (long double)'. (Cũng có một đảm bảo rằng tất cả các kích thước là không thể thiếu, nhưng đó là nhiều hơn hoặc ít hiểu.) –

+0

@ JamesKanze Muốn được pedantic có, bình luận tốt. Tôi đã cố gắng viết câu trả lời càng rõ ràng càng tốt theo loại câu hỏi và người hỏi. – gliderkite

2

Đối với hệ thống 32 bit, tiêu chuẩn 'thực tế' là ILP32 - tức là int, dài và con trỏ là tất cả các số lượng 32 bit.

Đối với hệ thống 64 bit, chuẩn Unix 'de facto' chính là LP64 - dài và con trỏ là 64 bit (nhưng int là 32 bit). Windows 64-bit tiêu chuẩn là LLP64 - dài dài và con trỏ là 64-bit (nhưng dài và int đều là 32-bit).

Đồng thời, một số hệ thống Unix đã sử dụng tổ chức ILP64.

Không có tiêu chuẩn thực tế nào được quy định theo tiêu chuẩn C (ISO/IEC 9899: 1999), nhưng tất cả đều được phép.

Nếu bạn đang quan tâm đến tính di động, hoặc bạn muốn tên của loại phản ánh kích thước, bạn có thể nhìn vào các tiêu đề, nơi các macro sau đây có sẵn:

int8_t int16_t int32_t int64_t

int8_t là đảm bảo được 8 bit, và int16_t là đảm bảo được 16 bit, v.v.

Xem này question.

+0

Không có gì đảm bảo rằng 'int8_t' vv tồn tại. Đối với tính di động tối đa, chỉ cần sử dụng 'int', trừ khi bạn biết bạn cần cái gì đó lớn hơn và xác nhận đầu vào của bạn. –

+0

@JamesKanze: ??? khá chuẩn. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html –

+0

@OAOD '' là tiêu đề C và C++ trong đó các loại này được xác định và trong '', 'int8_t' et al. được đánh dấu là tùy chọn. Trong tiêu chuẩn C, tôi nghĩ rằng chúng là "bắt buộc" nếu phần cứng hỗ trợ chúng; đó là ở bất kỳ tỷ lệ ý định.Nhưng chúng phải là loại kích thước chính xác và các loại đã ký phải là bổ sung của 2. Trên các máy không có 8 bit byte hoặc không phải là phần bổ sung 2, chúng sẽ không được xác định. (Posix yêu cầu chúng, giới hạn phần cứng mà trên đó nó có thể được triển khai.) –

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