Where are static variables stored in C and C++?

前端 未结 16 2074
自闭症患者
自闭症患者 2020-11-22 02:00

In what segment (.BSS, .DATA, other) of an executable file are static variables stored so that they don\'t have name collision? For example:


foo.c:                  


        
相关标签:
16条回答
  • 2020-11-22 02:24

    Data declared in a compilation unit will go into the .BSS or the .Data of that files output. Initialised data in BSS, uninitalised in DATA.

    The difference between static and global data comes in the inclusion of symbol information in the file. Compilers tend to include the symbol information but only mark the global information as such.

    The linker respects this information. The symbol information for the static variables is either discarded or mangled so that static variables can still be referenced in some way (with debug or symbol options). In neither case can the compilation units gets affected as the linker resolves local references first.

    0 讨论(0)
  • 2020-11-22 02:25

    in the "global and static" area :)

    There are several memory areas in C++:

    • heap
    • free store
    • stack
    • global & static
    • const

    See here for a detailed answer to your question:

    The following summarizes a C++ program's major distinct memory areas. Note that some of the names (e.g., "heap") do not appear as such in the draft [standard].

         Memory Area     Characteristics and Object Lifetimes
         --------------  ------------------------------------------------
    
         Const Data      The const data area stores string literals and
                         other data whose values are known at compile
                         time.  No objects of class type can exist in
                         this area.  All data in this area is available
                         during the entire lifetime of the program.
    
                         Further, all of this data is read-only, and the
                         results of trying to modify it are undefined.
                         This is in part because even the underlying
                         storage format is subject to arbitrary
                         optimization by the implementation.  For
                         example, a particular compiler may store string
                         literals in overlapping objects if it wants to.
    
    
         Stack           The stack stores automatic variables. Typically
                         allocation is much faster than for dynamic
                         storage (heap or free store) because a memory
                         allocation involves only pointer increment
                         rather than more complex management.  Objects
                         are constructed immediately after memory is
                         allocated and destroyed immediately before
                         memory is deallocated, so there is no
                         opportunity for programmers to directly
                         manipulate allocated but uninitialized stack
                         space (barring willful tampering using explicit
                         dtors and placement new).
    
    
         Free Store      The free store is one of the two dynamic memory
                         areas, allocated/freed by new/delete.  Object
                         lifetime can be less than the time the storage
                         is allocated; that is, free store objects can
                         have memory allocated without being immediately
                         initialized, and can be destroyed without the
                         memory being immediately deallocated.  During
                         the period when the storage is allocated but
                         outside the object's lifetime, the storage may
                         be accessed and manipulated through a void* but
                         none of the proto-object's nonstatic members or
                         member functions may be accessed, have their
                         addresses taken, or be otherwise manipulated.
    
    
         Heap            The heap is the other dynamic memory area,
                         allocated/freed by malloc/free and their
                         variants.  Note that while the default global
                         new and delete might be implemented in terms of
                         malloc and free by a particular compiler, the
                         heap is not the same as free store and memory
                         allocated in one area cannot be safely
                         deallocated in the other. Memory allocated from
                         the heap can be used for objects of class type
                         by placement-new construction and explicit
                         destruction.  If so used, the notes about free
                         store object lifetime apply similarly here.
    
    
         Global/Static   Global or static variables and objects have
                         their storage allocated at program startup, but
                         may not be initialized until after the program
                         has begun executing.  For instance, a static
                         variable in a function is initialized only the
                         first time program execution passes through its
                         definition.  The order of initialization of
                         global variables across translation units is not
                         defined, and special care is needed to manage
                         dependencies between global objects (including
                         class statics).  As always, uninitialized proto-
                         objects' storage may be accessed and manipulated
                         through a void* but no nonstatic members or
                         member functions may be used or referenced
                         outside the object's actual lifetime.
    
    0 讨论(0)
  • 2020-11-22 02:27

    It depends on the platform and compiler that you're using. Some compilers store directly in the code segment. Static variables are always only accessible to the current translation unit and the names are not exported thus the reason name collisions never occur.

    0 讨论(0)
  • 2020-11-22 02:30

    they're both going to be stored independently, however if you want to make it clear to other developers you might want to wrap them up in namespaces.

    0 讨论(0)
  • 2020-11-22 02:34

    When a program is loaded into memory, it’s organized into different segments. One of the segment is DATA segment. The Data segment is further sub-divided into two parts:

    Initialized data segment: All the global, static and constant data are stored here.
    Uninitialized data segment(BSS): All the uninitialized data are stored in this segment.

    Here is a diagram to explain this concept:

    enter image description here


    here is very good link explaining these concepts:

    http://www.inf.udec.cl/~leo/teoX.pdf

    0 讨论(0)
  • 2020-11-22 02:35

    you already know either it store in bss(block start by symbol) also referred as uninitialized data segment or in initialized data segment.

    lets take an simple example

    void main(void)
    {
    static int i;
    }
    

    the above static variable is not initialized , so it goes to uninitialized data segment(bss).

    void main(void)
    {
    static int i=10;
    }
    

    and of course it initialized by 10 so it goes to initialized data segment.

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