sizeof(array)
полностью реализован компилятором C. К тому времени, когда программа свяжется, то, что похоже на sizeof()
вызов к вам, будет преобразовано в константу.
Пример: когда вы компилируете этот код C:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
int a[33];
printf("%d\n", sizeof(a));
}
вы получите
.file "sz.c"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $164, %esp
movl $132, 4(%esp)
movl $.LC0, (%esp)
call printf
addl $164, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)"
.section .note.GNU-stack,"",@progbits
$132
в середине - это размер массива, 132 = 4 * 33. Обратите внимание, что нет инструкции call sizeof
- в отличие от printf
, которая является реальной функцией.