Skip to content

Latest commit

 

History

History
38 lines (25 loc) · 2.33 KB

decay.md

File metadata and controls

38 lines (25 loc) · 2.33 KB

Decay

In C++, "decay" refers to a type transformation process that happens in certain contexts, most notably when passing an array or function as an argument to a function. Decay is a concept from the C++ type system that simplifies certain aspects of how the compiler treats types, particularly when they are passed around in your code. Let's break it down:

  1. Array to Pointer Decay: When you pass an array to a function, it "decays" into a pointer to the first element of the array. This is why, inside the function, you lose information about the size of the array. For instance, if you have an array int arr[10]; and you pass it to a function, the function will receive it as int*.

  2. Function to Pointer Decay: Similarly, when you pass a function as an argument, the function name decays to a pointer to the function.

  3. Why Decay Happens: Decay is part of the C++ language rules and is inherited from C. It's a mechanism that simplifies passing compound types (like arrays and functions) around, as it standardizes them to pointer types. However, this also means that certain information (like array size) is lost.

  4. Implications of Decay:

    • Losing size information for arrays makes it necessary to pass additional size information or use a different type (like std::array or std::vector) that keeps track of size.
    • Function pointers can be used to create callback mechanisms or pass functions as arguments, but they don't carry information about the function's signature, which can lead to issues if not used carefully.
  5. Preventing Decay:

    • For arrays, you can pass them by reference, especially using templates which can retain the array's size information.
    • For functions, you can use std::function or template arguments to pass functions without decaying them into pointers.

Here's a simple example to illustrate array decay:

#include <iostream>

void foo(int* arr) {
    std::cout << sizeof(arr) << std::endl; // Will print the size of a pointer, not the array
}

int main() {
    int arr[10];
    std::cout << sizeof(arr) << std::endl; // Will print the size of the array
    foo(arr);
    return 0;
}

In this example, sizeof(arr) inside main() will give the actual size of the array, but inside foo(), it gives the size of a pointer, since the array has decayed to a pointer when passed to foo().