[GeekBand] C ++ Advanced Programming Technology (2), geekband Advanced Programming
This document is divided into two main parts: The first part is about the object model, and the second part is about the more in-depth study of new and delete.
2. Static binding and dynamic binding
In C, different function names are statically bound. Each function corresponds to an address and is stored in the corresponding location. In C ++, non-virtual member functions are also stored in static binding mode. For example, A: func1 () and other member functions.
However, for virtual functions, C ++ uses the dynamic binding method. In, each virtual function is stored in the virtual function table. When calling a virtual function, the compiler will find the correct function call along with the path in.
Because of dynamic binding, virtual functions can always be called wherever possible. This mechanism limits the possibility that virtual functions should be overwritten by virtual functions.
The following two methods can be used to obtain a virtual function.
A very common method based on virtual functions is to create a pointer linked list pointing to an abstract class, which is a manifestation of polymorphism.
The memory allocation of the class object model involves the bitwise alignment rules of objects, which is briefly introduced in another article in the blog.
- Locate the new and delete operators and their Overloading
When using new and delete, you can have an optional pointer type parameter to specify the starting address of memory allocation. Without this parameter, a suitable size of space is automatically allocated in the heap space.
The default new function is:
Void* Operator New (Size_t size,Void*Start)
You can use the following method for use: int * p = new (0x12345678) int;
In fact, we can also use other parameter columns for the new operation, or we can reload operator new and operator delete. For example, the following two common parameter columns:
Void* Operator New (Size_t size,Long extra)// The extra parameter is used to apply for a bucket. It is used to store special information, such as reference counting information.
Void* Operator New (Size_t size,Long extra,Char init)
Its inherent definition is:
Inline void* Operator New (Size_t size) {ReturnMalloc(Size);}
Inline void* Operator New [] (Size_t size) {ReturnMalloc(Size);}// The size is automatically calculated during the call.
Inline voidOperator Delete (Void*Ptr,Size_t size){Free(Ptr);}
Inline voidOperator Delete [] (Void*Ptr,Size_t size){Free(Ptr);}
Note: If you need to reload, the first parameter must always be in size_t format. In addition, the delete defined by myself will not be called, but will continue to use the default method to directly release the memory. Only when the new operation fails will the operator delete function with the same input parameter columns be searched. If the corresponding delete function is not defined, it can also be compiled, it means to discard the exception that failed to process new.