简体   繁体   中英

Memory allocation for a class that has deep inheritance in .NET

If I have classes A, B, C, D, E , and interfaces like X, Y, Z , and model a system like:

class B : A, X
class C : B, Y
class D : C, Z
class E : D

If A is an abstract base class and E is the class of interest, when I create an instance of E, would it in turn create instances of A, B, C, D, X, Y, Z in addition to E ?

If that's the case, would this create a huge performance overhead? Not memory, but runtime and GC wise.

Yes, it would create 'embedded' instances of A, B, C and D
No, it would not create instances of X, Y and Z (because they are interfaces)

There is no extra overhead for the memory allocation or GC (of ABCD) because the instance of E is allocated as 1 block. Any runtime overhead would entirely depend on the constructors involved.

There will always be a chain of contructors (from E to A) being executed, possibly the default constructor but it's also possible to call multiple constructors at 1 level.

It would create a single object - an instance of E - but that would include all the fields declared in the class hierarchy. (Interfaces can't declare fields, so they're irrelevant to the data within the object itself.) It's only fields (and any attributes affecting layout, admittedly) that contribute to the memory taken up by an object.

The reference to the instance of E could be "converted" to a reference of type A, B, C, D, X, Y or Z as an identity-preserving reference conversion - ie it would still be a reference to the same object.

The inheritance extends the Type and does not create instances. You have one single instance of E that includes the data defined by A, B, C, D and E. It provides methods and property accessors defined by these classes and the interfaces X, Y, and Z.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM