Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Kích thước con trỏ (Pointer Size) trong C/C++

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ợ.