ภาพรวม
ใน C++ เมื่อส่งอาร์เรย์เข้าไปในฟังก์ชัน อาร์เรย์จะ Decay เป็น Pointer ทำให้ sizeof ภายในฟังก์ชันคืนค่าขนาดของ Pointer (8 bytes บน 64-bit) ไม่ใช่ขนาดอาร์เรย์ทั้งหมด ต้องส่งขนาดมาพร้อมกัน หรือใช้ Template/Reference
ตัวอย่างโค้ดแสดงปัญหา
#include <iostream>
using namespace std;
void func(int a[]) {
cout << "Size in func: " << sizeof(a); // 8 bytes (pointer size)
}
int main() {
int array[5];
func(array);
cout << "\nSize in main: " << sizeof(array); // 20 bytes (5 * 4)
return 0;
}
ผลลัพธ์
Size in func: 8
Size in main: 20
วิธีแก้ไข (3 วิธี)
1. ส่งขนาดมาพร้อมกัน (Classic Way)
void func(int a[], int size) {
cout << "Size: " << size * sizeof(int);
}
2. ใช้ Template Reference (C++11) - แนะนำ
template <size_t N>
void func(int (&arr)[N]) {
cout << "Size: " << sizeof(arr); // ทำงานถูกต้อง!
cout << ", Elements: " << N;
}
3. ใช้ std::array หรือ std::vector (Modern C++)
#include <array>
#include <vector>
void funcArray(const array<int, 5>& arr) {
cout << "Size: " << arr.size() * sizeof(int);
}
void funcVector(const vector<int>& vec) {
cout << "Size: " << vec.size() * sizeof(int);
}
สรุปการเลือกใช้
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| ส่ง size แยก | เข้าใจง่าย, รองรับ C แบบเก่า | error-prone, ไม่ type-safe |
| Template Reference | Type-safe, compile-time size, zero overhead | ทำงานได้เฉพาะ fixed-size array |
| std::array | RAII, STL compatible, size() method | ต้องรู้ขนาด compile-time |
| std::vector | Dynamic size, สะดวกที่สุด | Heap allocation, slight overhead |
ข้อสังเกตเพิ่มเติม
sizeof(array)ใน main() ให้ 20 เพราะint4 bytes × 5 elements = 20 bytes- ในฟังก์ชัน
sizeof(a)ให้ 8 เพราะเป็น pointer (64-bit system) - C++20 มี
std::spanสำหรับ non-owning view ของ contiguous sequence