There are five cases (also applying to the *_n versions of the
- destroy is a no-op when the type is trivially destructible;
- uninitialized_default_construct is a no-op when the type is trivially default-constructible and destructible;
- uninitialized_value_construct zeroes out trivially default constructible types using memset;
- uninitialized_fill uses memset if both types are trivial and 1-byte long;
- uninitialized_copy and uninitialized_move use memcpy on trivially copy-constructible types.