• E
    qapi: Adjust layout of FooList types · e65d89bf
    Eric Blake 提交于
    By sticking the next pointer first, we don't need a union with
    64-bit padding for smaller types.  On 32-bit platforms, this
    can reduce the size of uint8List from 16 bytes (or 12, depending
    on whether 64-bit ints can tolerate 4-byte alignment) down to 8.
    It has no effect on 64-bit platforms (where alignment still
    dictates a 16-byte struct); but fewer anonymous unions is still
    a win in my book.
    
    It requires visit_next_list() to gain a size parameter, to know
    what size element to allocate; comparable to the size parameter
    of visit_start_struct().
    
    I debated about going one step further, to allow for fewer casts,
    by doing:
        typedef GenericList GenericList;
        struct GenericList {
            GenericList *next;
        };
        struct FooList {
            GenericList base;
            Foo *value;
        };
    so that you convert to 'GenericList *' by '&foolist->base', and
    back by 'container_of(generic, GenericList, base)' (as opposed to
    the existing '(GenericList *)foolist' and '(FooList *)generic').
    But doing that would require hoisting the declaration of
    GenericList prior to inclusion of qapi-types.h, rather than its
    current spot in visitor.h; it also makes iteration a bit more
    verbose through 'foolist->base.next' instead of 'foolist->next'.
    
    Note that for lists of objects, the 'value' payload is still
    hidden behind a boxed pointer.  Someday, it would be nice to do:
    
    struct FooList {
        FooList *next;
        Foo value;
    };
    
    for one less level of malloc for each list element.  This patch
    is a step in that direction (now that 'next' is no longer at a
    fixed non-zero offset within the struct, we can store more than
    just a pointer's-worth of data as the value payload), but the
    actual conversion would be a task for another series, as it will
    touch a lot of code.
    Signed-off-by: NEric Blake <eblake@redhat.com>
    Message-Id: <1455778109-6278-10-git-send-email-eblake@redhat.com>
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    e65d89bf
qapi-types.py 8.1 KB