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
ud2GCC 15.2 x86-64 with -O0