The shared library code is not present in the executable image on disk, but is kept in a separate library file. So size of executable file is smaller.
Operating system is less likely to page out shared library code that is being used by several applications, or copies of an application, rather than code that is only being used by a single application. This causes less page fault.
But sometimes you may be interested in only a few of the routines in a library, and these routines may be scattered widely in the virtual address space of the library. Thus, the total number of pages you need to touch to access all of your routines is significantly higher than if these routines were all bound directly into your executable program. One impact of this situation is that, if you are the only user of these routines, you experience more page faults to get them all into real memory.
Faster program startup as load time might be reduced because the shared library code might already be in memory.
The routines are not statically bound to the application but are dynamically bound when the application is loaded. This permits applications to automatically inherit changes to the shared libraries, without recompiling or rebinding.
So option A, C and D are always the advantage of the shared DLL. Only option B is not always an advantage.