$ cd ../
$ cat /backups/brain/
0046
alloca vs VLA in C
1
2
3
4
5
6
#include <alloca.h>

int square(int num) {
    char b1[num];
    char *b2 = (char *)alloca(num * sizeof(char));
}

Gets compiled to

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
square(int):
        push    rbp
        mov     rbp, rsp
        sub     rsp, 48
        mov     DWORD PTR [rbp-36], edi
        // VLA
        mov     eax, DWORD PTR [rbp-36]
        movsx   rdx, eax
        sub     rdx, 1
        mov     QWORD PTR [rbp-8], rdx
        cdqe
        mov     edx, 16
        sub     rdx, 1
        add     rax, rdx
        mov     ecx, 16
        mov     edx, 0
        div     rcx
        imul    rax, rax, 16
        sub     rsp, rax
        mov     rax, rsp
        mov     QWORD PTR [rbp-16], rax
        // Alloca
        mov     eax, DWORD PTR [rbp-36]
        cdqe
        lea     rdx, [rax+8]
        mov     eax, 16
        sub     rax, 1
        add     rax, rdx
        mov     esi, 16
        mov     edx, 0
        div     rsi
        imul    rax, rax, 16
        sub     rsp, rax
        mov     rax, rsp
        add     rax, 15
        shr     rax, 4
        sal     rax, 4
        mov     QWORD PTR [rbp-24], rax
        ud2

GCC 15.2 x86-64 with -O0

$ cd ../