Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do functions occupy memory space?

Tags:

c

function

memory

void demo()
{
    printf("demo");
}

int main()
{
    printf("%p",(void*)demo);
    return 0;
}

The above code prints the address of function demo.
So if we can print the address of a function, that means that this function is present in the memory and is occupying some space in it.
So how much space it is occupying in the memory?

like image 658
kevin gomes Avatar asked Feb 12 '14 17:02

kevin gomes


People also ask

How is a function stored in memory?

This is because in machine code, a function is referenced by its location in RAM, not its name. The compiler-output object file may have a func entry in its symbol table referring to this block of machine code, but the symbol table is read by software, not something the CPU hardware can decode and run directly.

Do member functions occupy space in objects?

No, The size of local variables does not affects the size of object as it's size is independent of local variable. The local variable of member function would get memory in the stack at the time of function execution. Hope, this would help.

Does class definition occupy memory?

Class does not occupy memory.

Which memory area is used when a function is called?

The run-time stack holds frames, where each frame holds information about one function call, including the function's variables, information about which function called it, and some information to help the program manage the run-time stack.


1 Answers

You can see for yourself using objdump -r -d:

0000000000000000 <demo>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   bf 00 00 00 00          mov    $0x0,%edi
                        5: R_X86_64_32  .rodata
   9:   b8 00 00 00 00          mov    $0x0,%eax
   e:   e8 00 00 00 00          callq  13 <demo+0x13>
                        f: R_X86_64_PC32        printf-0x4
  13:   5d                      pop    %rbp
  14:   c3                      retq   

0000000000000015 <main>:

EDIT

I took your code and compiled (but not linked!) it. Using objdump you can see the actual way the compiler lays out the code to be run. At the end of the day there is no such thing as a function: for the CPU it's just a jump to some location (that in this listing happens to be labeled). So the size of the "function" is the size of the code that comprises it.


There seems to be some confusion that this is somehow not "real code". Here is what GDB says:

Dump of assembler code for function demo:
   0x000000000040052d <+0>:     push   %rbp
   0x000000000040052e <+1>:     mov    %rsp,%rbp
   0x0000000000400531 <+4>:     mov    $0x400614,%edi
   0x0000000000400536 <+9>:     mov    $0x0,%eax
   0x000000000040053b <+14>:    callq  0x400410 <printf@plt>
   0x0000000000400540 <+19>:    pop    %rbp
   0x0000000000400541 <+20>:    retq   

This is exactly the same code, with exactly the same size, patched by the linker to use real addresses. gdb prints offsets in decimal while objdump uses the more favourable hex. As you can see, in both cases the size is 21 bytes.

like image 84
cnicutar Avatar answered Oct 14 '22 23:10

cnicutar