Find size of a function in C

后端 未结 9 1731
别跟我提以往
别跟我提以往 2020-12-10 16:37

I am learning function pointers,I understand that we can point to functions using function pointers.Then I assume that they stay in memory.Do they stay in stack or heap?Can

相关标签:
9条回答
  • 2020-12-10 16:49

    The space for code is statically allocated by the linker when you build the code. In the case where your code is loaded by an operating system, the OS loader requests that memory from the OS and the code is loaded into it. Similarly static data as its name suggests is allocated at this time, as is an initial stack (though further stacks may be created if additional threads are created).

    With respect to determining the size of a function, this information is known to the linker, and in most tool-chains the linker can create a map file that includes the size and location of all static memory objects (i.e. those not instantiated at run-time on the stack or heap).

    There is no guaranteed way of determining the size of a function at run-time (and little reason to do so) however if you assume that the linker located functions that are adjacent in the source code sequentially in memory, then the following may give an indication of the size of a function:

    int first_function()
    {
       ...
    }
    
    void second_function( int arg )
    {
        ...
    }
    
    int main( void )
    {
        int first_function_length = (int)second_function - (int)first_function ;
        int second_function_length = (int)main - (int)second_function ;
    
    }
    

    However YMMV; I tried this in VC++ and it only gave valid results in a "Release" build; the results for a "Debug" build made no real sense. I suggest that the exercise is for interest only and has no practical use.

    Another way of observing the size of your code of course is to look at the disassembly of the code in your debugger for example.

    0 讨论(0)
  • 2020-12-10 16:50

    If there is anything like the size of the function it should be its STACK FRAME SIZE. Or better still please try to contemplate what exactly, according to you, should be the size of a function? Do you mean its static size, that is the size of all its opcode when it is loaded into memory?If that is what you mean, then I dont see their is any language provided feature to find that out.May be you look for some hack.There can be plenty.But I haven't tried that.

    0 讨论(0)
  • 2020-12-10 16:55

    C has no garbage collector. Having a pointer to something doesn't make it stay in memory.

    Functions are always in memory, whether or not you use them, whether or not you keep a pointer to them.

    Dynamically allocated memory can be freed, but it has nothing to do with keeping a pointer to it. You shouldn't keep pointer to memory you have freed, and you should free it before losing the pointer to it, but the language doesn't do it automatically.

    0 讨论(0)
  • 2020-12-10 16:56

    Functions are part of text segment (which may or may not be 'heap') or its equivalent for the architecture you use. There's no data past compilation regarding their size, at most you can get their entry point from symbol table (which doesn't have to be available). So you can't calculate their size in practice on most C environments you'll encounter.

    0 讨论(0)
  • 2020-12-10 16:57

    They're (normally) separate from either the stack or heap.

    There are ways to find their size, but none of them is even close to portable. If you think you need/want to know the size, chances are pretty good that you're doing something you probably ought to avoid.

    0 讨论(0)
  • 2020-12-10 17:01

    There's an interesting way to discover the size of the function.

    #define RETN_empty 0xc3
    #define RETN_var   0xc2  
    typedef unsigned char BYTE;
    size_t FunctionSize(void* Func_addr) {
        BYTE* Addr = (BYTE*)Func_addr;
        size_t function_sz = 0;
        size_t instructions_qt = 0;
            while(*Addr != (BYTE)RETN_empty && *Addr != (BYTE)RETN_var) {
                size_t inst_sz = InstructionLength((BYTE*)Addr);
                function_sz += inst_sz;
                Addr += inst_sz;
                ++instructions_qt;
            }
        return function_sz + 1;
    }
    

    But you need a function that returns the size of the instruction. You can find a function that finds the Instruction Length here: Get size of assembly instructions. This function basically keeps checking the instructions of the function until it finds the instruction to return (RETN)[ 0xc3, 0xc2], and returns the size of the function.

    0 讨论(0)
提交回复
热议问题