2012-07-16 46 views
13

Tôi đang đưa ra giả định (có thể sai) rằng nó được thực hiện và/hoặc phụ thuộc vào hệ thống. Có cái gì đó như INT_MAX hoặc CHAR_BIT mà sẽ cho tôi biết kích thước của một con trỏ trong bộ nhớ?Con trỏ C++ sử dụng bao nhiêu bộ nhớ?

+1

Bạn nên cẩn thận với con trỏ hàm thành viên, vì chúng có thể có kích thước khác nhau, không giống như những người bình thường. Xem http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible để biết thêm chi tiết về đẫm máu. –

Trả lời

28

Con trỏ trỏ vào một vị trí trong bộ nhớ, vì vậy nó sẽ là 32 bit trên hệ thống 32 bit và 64 bit trong hệ thống 64 bit.

kích thước con trỏ cũng là không thích hợp để loại nó trỏ tại, và có thể được đo bằng sizeof(anyType*)

UPD

Con đường tôi đã trả lời này đã được đề xuất bởi cách câu hỏi được hỏi (đề xuất một câu trả lời đơn giản). Có, tôi đồng ý rằng trong các trường hợp như con trỏ tới bảng phương thức ảo, kích thước của con trỏ sẽ khác nhau và theo this article, nó sẽ khác nhau trên các nền tảng khác nhau và thậm chí trên các trình biên dịch khác nhau trong cùng một nền tảng. Trong trường hợp của tôi, ví dụ (x64 ubuntu, GCC 4.6.3) nó bằng 16 byte.

+0

Tất nhiên - cách đơn giản, nhưng đúng vậy. –

+2

Sai. Trên hệ điều hành 64 bit, bạn vẫn có thể có chương trình được biên dịch ở chế độ 32 bit. –

+0

Tôi cout'ed 'sizeof (int *)' và câu trả lời là '4'. Điều đó có nghĩa là 4 byte? (hơi thú vị vì đây là một máy 64-bit). Tôi đang biên dịch với Visual C++. – HorseloverFat

5

Liệu sizeof(int*) có hoạt động không? Hoặc bất cứ điều gì bạn muốn kiểm tra?

1

Kích thước của con trỏ phụ thuộc vào hệ điều hành của bạn (thực sự là số bit của hệ điều hành), hãy thử chức năng sizeof (type *).

+1

Sai. Trên hệ điều hành 64 bit, bạn vẫn có thể có chương trình được biên dịch ở chế độ 32 bit. –

+0

@ icando..so kích thước của con trỏ có phụ thuộc vào chế độ bạn đang biên dịch không ?? Ví dụ: – Tejendra

+0

@Tejendra - ví dụ: Visual Studio có 2 chế độ - Win32 - cho 32 bit và một cho x64 (quên tên) –

2

Đó chắc chắn là hệ thống phụ thuộc. Thông thường, một con trỏ dữ liệu đơn giản có thể được lưu trữ trong một biến size_t. Trong C++ 11 có macro SIZE_MAX là giá trị tối đa cho size_t. Trong C++ 11, bạn cũng có thể sử dụng std::intptr_t.

Nếu bạn đang dùng các con trỏ hàm thành viên, hãy xem xét mọi thứ trở nên phức tạp hơn. Nó phụ thuộc vào những thứ khác nếu lớp thừa kế từ một hoặc nhiều cha mẹ, nếu nó cho thấy các chức năng ảo, và tất nhiên về việc thực hiện.

Here bạn có thể tìm thấy bài viết chi tiết về các con trỏ hàm thành viên, cùng với một số ví dụ về vài trình biên dịch.

2

Câu trả lời cho một trường hợp đơn giản như int* là đơn giản và được đưa ra trên các câu trả lời khác. Tuy nhiên, hãy nhớ rằng các thành viên của các đối tượng sử dụng nhiều thừa kế có thể chứa nhiều (WORD/DWORDs/QWORD), trong trường hợp xấu nhất lên đến 5 (năm).

Tốt bài viết về vấn đề này: http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

+0

Chính xác đa thừa kế có thể ảnh hưởng đến kích thước của con trỏ như thế nào? – EJP

+0

Không. Như được viết, câu trả lời đơn giản là sai. Tôi nghi ngờ rằng các poster đã được suy nghĩ của con trỏ đến các thành viên, mà có thể có một kích thước khác biệt rõ ràng hơn so với con trỏ khác. (Tất nhiên, không có yêu cầu tất cả các con trỏ có cùng kích thước, ngay cả trong C, và tôi đã làm việc trên các máy có 'sizeof (int *)! = Sizeof (char *)', hoặc nơi con trỏ tới các hàm có một kích thước hơn con trỏ vào dữ liệu.) –

+0

Tôi hiện không thể viết một thông báo chi tiết hơn. Trong một vài giờ, tôi sẽ cập nhật bài đăng của mình. –

-1
#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    printf(" %d",sizeof(int *)); 
    printf(" %d",sizeof(char *)); 
    printf(" %d",sizeof(float *)); 
    printf(" %d",sizeof(double *)); 
    getch(); 
} 
+0

đã sử dụng chương trình này và hiển thị "2" của nó làm đầu ra cho tất cả các lệnh printf. Vì vậy, nếu tôi không sai, thì con trỏ sẽ mất 2 byte .... –

+0

... chỉ trên máy tính cụ thể và có lẽ là khá cũ mà bạn đã sử dụng. Không có quy tắc về kích thước, mặc dù trên hầu hết các máy tính hiện đại, nó chắc chắn sẽ khác với 2. –

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