Defines functions for memory allocation, alignment, copying, and comparing.

## Porters

All of the "Unchecked" and "Free" functions must be implemented, but they should
not be called directly. The Starboard platform wraps them with extra accounting
under certain circumstances.

## Porters and Application Developers

Nobody should call the "Checked", "Unchecked" or "Free" functions directly
because that evades Starboard's memory tracking. In both port implementations
and Starboard client application code, you should always call SbMemoryAllocate
and SbMemoryDeallocate rather than SbMemoryAllocateUnchecked and SbMemoryFree.

- The "checked" functions are SbMemoryAllocateChecked(),
  SbMemoryReallocateChecked(), and SbMemoryAllocateAlignedChecked().

- The "unchecked" functions are SbMemoryAllocateUnchecked(),
  SbMemoryReallocateUnchecked(), and SbMemoryAllocateAlignedUnchecked().

- The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().

## Enums

### SbMemoryMapFlags

The bitwise OR of these flags should be passed to SbMemoryMap to indicate how
the mapped memory can be used.

#### Values

- `kSbMemoryMapProtectReserved`

  No flags set: Reserves virtual address space. SbMemoryProtect() can later
  make it accessible.
- `kSbMemoryMapProtectRead`

- `kSbMemoryMapProtectWrite`

- `kSbMemoryMapProtectExec`

- `kSbMemoryMapProtectReadWrite`

## Functions

### SbMemoryAllocate

Allocates and returns a chunk of memory of at least `size` bytes. This function
should be called from the client codebase. It is intended to be a drop-in
replacement for `malloc`.

Note that this function returns `NULL` if it is unable to allocate the memory.

`size`: The amount of memory to be allocated. If `size` is 0, the function may
return `NULL` or it may return a unique pointer value that can be passed to
SbMemoryDeallocate.

#### Declaration

    void* SbMemoryAllocate(size_t size)

### SbMemoryAllocateAligned

Allocates and returns a chunk of memory of at least `size` bytes, aligned to
`alignment`. This function should be called from the client codebase. It is
meant to be a drop-in replacement for `memalign`.

The function returns `NULL` if it cannot allocate the memory. In addition, the
function's behavior is undefined if `alignment` is not a power of two.

`alignment`: The way that data is arranged and accessed in memory. The value
must be a power of two. `size`: The size of the memory to be allocated. If
`size` is `0`, the function may return `NULL` or it may return a unique aligned
pointer value that can be passed to SbMemoryDeallocateAligned.

#### Declaration

    void* SbMemoryAllocateAligned(size_t alignment, size_t size)

### SbMemoryAllocateAlignedChecked

Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
allocation failure.

DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.

#### Declaration

    void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)

### SbMemoryAllocateAlignedUnchecked

This is the implementation of SbMemoryAllocateAligned that must be provided by
Starboard ports.

DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.

#### Declaration

    void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)

### SbMemoryAllocateChecked

Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation
failure.

DO NOT CALL. Call SbMemoryAllocate(...) instead.

#### Declaration

    void* SbMemoryAllocateChecked(size_t size)

### SbMemoryAllocateNoReport

DEPRECATED: Same as SbMemoryAllocate().

#### Declaration

    void* SbMemoryAllocateNoReport(size_t size)

### SbMemoryAllocateUnchecked

This is the implementation of SbMemoryAllocate that must be provided by
Starboard ports.

DO NOT CALL. Call SbMemoryAllocate(...) instead.

#### Declaration

    void* SbMemoryAllocateUnchecked(size_t size)

### SbMemoryCalloc

A wrapper that implements a drop-in replacement for `calloc`, which is used in
some packages.

#### Declaration

    static void* SbMemoryCalloc(size_t count, size_t size)

### SbMemoryDeallocate

Frees a previously allocated chunk of memory. If `memory` is NULL, then the
operation is a no-op. This function should be called from the client codebase.
It is meant to be a drop-in replacement for `free`.

`memory`: The chunk of memory to be freed.

#### Declaration

    void SbMemoryDeallocate(void *memory)

### SbMemoryDeallocateAligned

`memory`: The chunk of memory to be freed. If `memory` is NULL, then the
function is a no-op.

#### Declaration

    void SbMemoryDeallocateAligned(void *memory)

### SbMemoryDeallocateNoReport

DEPRECATED: Same as SbMemoryDeallocate()

#### Declaration

    void SbMemoryDeallocateNoReport(void *memory)

### SbMemoryFlush

Flushes any data in the given virtual address range that is cached locally in
the current processor core to physical memory, ensuring that data and
instruction caches are cleared. This is required to be called on executable
memory that has been written to and might be executed in the future.

#### Declaration

    void SbMemoryFlush(void *virtual_address, int64_t size_bytes)

### SbMemoryFree

This is the implementation of SbMemoryDeallocate that must be provided by
Starboard ports.

DO NOT CALL. Call SbMemoryDeallocate(...) instead.

#### Declaration

    void SbMemoryFree(void *memory)

### SbMemoryFreeAligned

This is the implementation of SbMemoryFreeAligned that must be provided by
Starboard ports.

DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.

#### Declaration

    void SbMemoryFreeAligned(void *memory)

### SbMemoryMap

Allocates `size_bytes` worth of physical memory pages and maps them into an
available virtual region. This function returns `SB_MEMORY_MAP_FAILED` on
failure. `NULL` is a valid return value.

`size_bytes`: The amount of physical memory pages to be allocated. `flags`: The
bitwise OR of the protection flags for the mapped memory as specified in
`SbMemoryMapFlags`. Allocating executable memory is not allowed and will fail.
If executable memory is needed, map non-executable memory first and then switch
access to executable using SbMemoryProtect. When kSbMemoryMapProtectReserved is
used, the address space will not be accessible and, if possible, the platform
should not count it against any memory budget. `name`: A value that appears in
the debugger on some platforms. The value can be up to 32 bytes.

#### Declaration

    void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)

### SbMemoryProtect

Change the protection of `size_bytes` of memory regions, starting from
`virtual_address`, to `flags`, returning `true` on success.

#### Declaration

    bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)

### SbMemoryReallocate

Attempts to resize `memory` to be at least `size` bytes, without touching the
contents of memory.

- If the function cannot perform the fast resize, it allocates a new chunk of
  memory, copies the contents over, and frees the previous chunk, returning a
  pointer to the new chunk.

- If the function cannot perform the slow resize, it returns `NULL`, leaving
  the given memory chunk unchanged.

This function should be called from the client codebase. It is meant to be a
drop-in replacement for `realloc`.

`memory`: The chunk of memory to be resized. `memory` may be NULL, in which case
it behaves exactly like SbMemoryAllocateUnchecked. `size`: The size to which
`memory` will be resized. If `size` is `0`, the function may return `NULL` or it
may return a unique pointer value that can be passed to SbMemoryDeallocate.

#### Declaration

    void* SbMemoryReallocate(void *memory, size_t size)

### SbMemoryReallocateChecked

Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
allocation failure.

DO NOT CALL. Call SbMemoryReallocate(...) instead.

#### Declaration

    void* SbMemoryReallocateChecked(void *memory, size_t size)

### SbMemoryReallocateUnchecked

This is the implementation of SbMemoryReallocate that must be provided by
Starboard ports.

DO NOT CALL. Call SbMemoryReallocate(...) instead.

#### Declaration

    void* SbMemoryReallocateUnchecked(void *memory, size_t size)

### SbMemoryUnmap

Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
`true` on success. After this function completes, \[virtual_address,
virtual_address + size_bytes) will not be read/writable. This function can unmap
multiple contiguous regions that were mapped with separate calls to
SbMemoryMap(). For example, if one call to `SbMemoryMap(0x1000)` returns
`(void*)0xA000`, and another call to `SbMemoryMap(0x1000)` returns
`(void*)0xB000`, `SbMemoryUnmap(0xA000, 0x2000)` should free both regions.

#### Declaration

    bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)