Settings

Theme

The Lost Art of C Structure Packing

catb.org

13 points by djulius 11 years ago · 4 comments

Reader

krylon 11 years ago

A couple of years back, I ran into a nasty problem with structure packing that made me get acquainted with structure padding and packing.

The company I was working at used the OpenWatcom compiler that lets you tune structure padding with a compiler flag. Also, they "serialized" their data by simply writing arrays of structs to files and reading them back in later. Raw binary files, no conversion whatsoever.

So one day - I hadn't been there very long - I was given the task to make a certain change to the application, as well as a copy of a "database" to experiment on. I made a first adjustment, compiled my code, ran it and - BAM! It took me nearly a day to figure out that I had "forgotten" to pass a certain variable to make which in turn resulted in a certain parameter being passed to the Watcom compiler that caused it to use no structure padding at all.

Without that variable/parameter, I had compiled the program to use a different padding (i.e. use padding at all), so when my program read the data file (having been dumped by a version of the program being compiled without padding), it barfed, so to speak.

That problem caused me to do a little reading on the matter. I sure wish somebody had pointed that article out to me back then. (Assuming it had existed back then, with "back then" being about October 2007.)

pcmonk 11 years ago

This is a good article that comes up every so often. If you haven't read it, you should. The art is not quite as lost as advertised, though. A lot of C programmers pack structures that way out of habit.

There's definitely some cases where you shouldn't follow the "biggest to smallest" ordering, but they're usually pretty obvious when you run into them. They usually involve inheritance and such.

Mithaldu 11 years ago

In the example in part 4, doesn't this:

    char *p;     /* 8 bytes */
    long x;      /* 8 bytes */
    char c;      /* 1 byte  */
Just end up being this, to align whatever comes after it in memory?

    char *p;     /* 8 bytes */
    long x;      /* 8 bytes */
    char c;      /* 1 byte  */
    char pad[7]; /* 7 bytes */
sctb 11 years ago

Recent discussion: https://news.ycombinator.com/item?id=9069031

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection