 <p>My take is that <code>__size</code> and <code>__align</code> fields specify (guess what :-) ) the size and alignment of the structure independently of the <code>__data</code> structure. So, the data can be of a less size and have less alignment requirements, it can be modified freely without breaking these basic assumptions about it. And vice-versa, these basic characteristics can be changed without altering the data structure, like <a href="https://sourceware.org/ml/libc-alpha/2003-04/msg00208.html">here</a>.</p> <p>It is important to note that if the size of the <code>__data</code> becomes bigger than specified by <code>__SIZEOF_PTHREAD_MUTEX_T</code>, an assertion fails in <code>__pthread_mutex_init()</code>:</p> <pre><code>assert (sizeof (pthread_mutex_t) &lt;= __SIZEOF_PTHREAD_MUTEX_T); </code></pre> <p>Consider this assertion as an essential part of this approach.</p> <p>So, the conclusion is that this was done not to hide the implementation details, but to make the data structure more predictable and manageable. It is very important for a widely-used library which should care a lot about backward compatibility and performance impact to other codes from the changes which can be made to this structure.</p>