← All notes

alloca vs VLA in C

#include <alloca.h>

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

Gets compiled to

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