Kích thước con trỏ không cố định – phụ thuộc vào:
- Kiến trúc CPU: 32-bit → 4 bytes, 64-bit → 8 bytes.
- Hệ điều hành / ABI: x86-64 Linux/Windows (LP64/LLP64) – data pointer 8 bytes.
- Mô hình bộ nhớ: near/far/huge pointer (16-bit DOS cũ).
- Loại con trỏ: data pointer, function pointer, member pointer – có thể khác nhau.
Quy tắc chung
- Trên cùng kiến trúc: tất cả data pointer (int*, float*, void*, MyClass*) cùng kích thước.
sizeof(void*) == sizeof(int*) == sizeof(MyClass*).- Function pointer có thể lớn hơn (trên một số kiến trúc Harvard).
- Member pointer (
int Class::*) thường lớn hơn (chứa offset, vtable index...).
Ví dụ kiểm tra
#include <iostream>
struct A { virtual void f(); };
int main() {
std::cout << "void*: " << sizeof(void*) << '\n'
<< "int*: " << sizeof(int*) << '\n'
<< "float*: " << sizeof(float*) << '\n'
<< "A*: " << sizeof(A*) << '\n'
<< "void(*)(): " << sizeof(void(*)()) << '\n'
<< "int A::*: " << sizeof(int A::*) << '\n';
}
Kết quả thường gặp (Linux x86-64)
void*: 8 int*: 8 float*: 8 A*: 8 void(*)(): 8 int A::*: 8 // hoặc 16/24 tùy ABI (multiple inheritance, virtual inheritance)
Lưu ý quan trọng
- Không giả định
sizeof(pointer) == sizeof(int)– sai trên 64-bit (int thường 4 bytes). - Dùng
uintptr_t(<cstdint>) để ép con trỏ sang integer an toàn. - Serialization/network: phải xử lý endianness và pointer size khác nhau giữa client/server.
- C++20:
std::size_tđủ lớn để chứa con trỏ trên mọi platform hỗ trợ.