Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any practical difference between an array and a VLA of known size in C?

Tags:

c

optimization

I know VLAs have their own properties, but is there any practical difference (either performance or otherwise) between an array and a VLA with a known size?

For example:


inline int createVLA(int size)
{
    int VLA[size];//compiler can deduce that size == 7
    return sizeof(VLA);
}

int main()
{
    int i = 5;
    return createVLA(i + 2);
}

I know this program could technically be optimized away almost entirely, but imagine if the VLA was actually used for something.

like image 485
Badasahog Avatar asked Oct 22 '25 15:10

Badasahog


1 Answers

There are at least three differences.

One, a variable-length array cannot be declared with thread_local, static, or extern:

static int A[4];     // Okay.
static int B[size];  // Error.

(Technically, the C standard just requires a diagnostic for the latter, after which an implementation can do anything, including supporting it. Somehow.)

Two, the size of a variable-length array is not a constant expression:

int A[4], B[size];
static int x = sizeof A;  // Okay.
static int y = sizeof B;  // Error.

(Again, technically an implementation could somehow support the size of a variable-length array as a constant expression even though the C standard does not require it.)

Three: The lifetime of a fixed-length array begins when execution enters its block, while the lifetime of a variable-length array begins when execution reaches its declaration:

switch (2)
{
        int A[4];
        int B[size];
        …
    case 2:
        A[0] = 3;  // Okay.
        B[0] = 3;  // Error, B does not exist yet.
        …
}
like image 83
Eric Postpischil Avatar answered Oct 25 '25 06:10

Eric Postpischil



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!