[3.7] bpo-27987: align PyGC_Head to alignof(long double) by methane · Pull Request #13335 · python/cpython (original) (raw)

@vstinner You wrote:

struct {
    void *next;
    void *prev;
} _gc;

But it is actually:

struct {
    void *next;
    void *prev;
    ssize_t gc_refs; /* only in Python < 3.8 */
} _gc;

This is very big difference between Python 3.7 and 3.8. That's why I closed PR for 3.8 but don't close this.

sizeof(PyGC_Head) is 12 byte on x86, regardless alignment is double or long double. (I can now "gcc -m32" on Ubuntu, thank you)
On amd64, sizeof(PyGC_Head) is 24 byte with double alignment, and 32byte with long double alignment.

What is the effect of PyListObject for example? Is the address of ob_item aligned to 16 bytes on x86 (32-bit)? Is it on x86-64 (64 bit)?

This pull request affects only where PyObject* ((PyObject*)(gc + 1)) is aligned.
This pull request doesn't affect alignment in PyListObject. offsetof(PyListObject, ob_item) is 24.