Why does `std::make_shared` perform two separate allocations with `-fno-rtti`? : <pre><code>#include &lt;memory&gt;
struct foo { };
int main() { std::make_shared&lt;foo&gt;(); }
</code></pre>

<p>The asssembly generated by both <code>g++7</code> and <code>clang++5</code> with <code>-fno-exceptions -Ofast</code> for the code above:</p>

<ul>
<li><p>Contains a single call to <code>operator new</code> if <code>-fno-rtti</code> is <strong>not</strong> passed.</p></li>
<li><p>Contains <strong>two separate calls</strong> to <code>operator new</code> if <code>-fno-rtti</code> is <strong>passed</strong>.</p></li>
</ul>

<p>This can be easily verified <a href="https://godbolt.org/g/z52YT0" rel="noreferrer">on <strong>gcc.godbolt.org</strong></a> <em>(<a href="https://godbolt.org/g/wikZOd" rel="noreferrer"><code>clang++5</code> version</a>)</em>:</p>

<p><a href="https://i.stack.imgur.com/PXa2K.png" rel="noreferrer"><img src="https://i.stack.imgur.com/PXa2K.png" alt="screenshot of the above godbolt link with highlighed operator new calls"></a></p>

<p>Why is this happening? Why does disabling RTTI prevent <code>make_shared</code> from unifying the <em>object</em> and <em>control block</em> allocations?</p>
