Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Array Decay ใน C++ คืออะไร และป้องกันอย่างไร

Array Decay คือการที่อาร์เรย์สูญเสียข้อมูลประเภทและขนาด เมื่อส่งผ่านฟังก์ชัน อาร์เรย์จะ "สลาย" (Decay) กลายเป็น Pointer ไปยังองค์ประกอบแรก ทำให้ sizeof ให้ขนาดของ Pointer แทนขนาดอาร์เรย์เดิม

ตัวอย่าง Array Decay

#include <iostream>
using namespace std;

void DisplayValue(int* p) {
    cout << "New size by passing value: " << sizeof(p) << endl; // 8 (pointer size)
}

void DisplayPointer(int (*p)[10]) {
    cout << "New size by passing pointer: " << sizeof(p) << endl; // 8 (pointer size)
}

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    cout << "Actual size of array: " << sizeof(arr) << endl; // 40 (10 * 4 bytes)

    DisplayValue(arr);      // Decay to int*
    DisplayPointer(&arr);   // Pass pointer to array[10]

    return 0;
}

ผลลัพธ์

Actual size of array: 40
New size by passing value: 8
New size by passing pointer: 8

วิธีป้องกัน Array Decay

1. ส่งขนาดอาร์เรย์เป็นพารามิเตอร์แยก

void func(int arr[], int size) { ... }

2. ส่งโดย Reference (แนะนำ)

void Display(int (&p)[10]) {
    cout << "Size by reference: " << sizeof(p) << endl; // 40 ✓
}

int main() {
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    Display(arr); // ไม่ decay
}

3. ใช้ std::array (C++11) - แนะนำมากที่สุด

#include <array>
void func(array& arr) {
    cout << arr.size(); // 10 ✓
}

4. ใช้ std::vector

void func(const vector& vec) {
    cout << vec.size();
}

สรุป

ควรใช้ std::array หรือ std::vector แทน C-style array เพื่อหลีกเลี่ยง Array Decay และได้ฟีเจอร์เพิ่มเติม