Un-alignment in structures

Andrew Burt aburt at cisden.UUCP
Thu Mar 14 07:41:22 AEST 1985


I don't recall seeing this hashed out in here so I thought I'd see what
the general reaction is.

Recently I've had to work around a machine dependency (on several machines)
that it strikes me C should allow me to avoid.  After all, C is
supposed to be portable and "low" level at the same time, right?  The
problem is in structure padding.  I fully realize why when I say:
	
	struct foo {
		int	i;
	};

	struct bar {
		char		c;
		struct foo	f;
	};

I may get an internal representation with c having offset 0 from the
beginning of bar and f.i having offset, say, 2 (or 4 or ...) with a byte
in between them not being used.  I also understand the same thing
happening if struct foo is:

	struct foo {
		char	c;
	};

However, it would be useful (I didn't say efficient, mind you) if
I could say something like
	
	struct bar {
		char			c;
		unaligned struct foo	f;
	};

with the effect that f.c would have an offset of 1 from the beginning
of struct bar; or f.i -- yes, an int at an odd address.  I mean this
regardless of how it's implemented.  E.g. if I did

	struct bar b;
	b.f.i = 7;

I would expect code to be generated analogous to

	int tmp = 7;
	bcopy(&tmp, &b.f.i, sizeof int);

Clearly this is not what I want for a default, since most code really
doesn't care about padding in the middle of structures (or so I would
imagine).  But this would be wonderful for porting code and especially
data files to other architectures.  Not to mention dealing with
non-unix machines:  I'm working on a large piece of comm software that
has to speak to a large variety of machines on a lan, all of which get
very upset when I

	write(fd, &b, sizeof(struct bar));

and they get nifty-keen nulls in the middle of it all.  If perhaps I could
choose how to organize my structures such that I had, say, two characters
followed by that int (or whatever I need so that I don't get any padding)
I wouldn't mind so much.  But the case here is that I have to talk the
language of the remote system, not vice versa -- and it says "char followed
by int" (for example).  Since I have no choice, I am writing out a string,
doing the bcopy's into it with #defined offsets.  Not pretty.

(The variable length fields I get back are another can of worms entirely,
but I wouldn't even think of suggesting that C should generate code knowing
which bytes imply what structure sizes to use.  After all, I need something
to do to earn my paycheck :-)

If we wanted to get carried away, we could ask for structure assignments
between aligned and non-aligned structures with the same elements (the
difference being the latter has padding).  Maybe something like this...

	struct bar b;
	unaligned struct bar ub;

	ub = (unaligned) b;

Imagine how easy it would be to port a data file.

In terms of practicality, I wouldn't want this put into C or the ANSI standard.
I was thinking more along the lines of C++, or if it's too late for that,
C+=2.  Certainly the language has to grow or it will stagnate.
-- 
Andrew Burt
Contel Information Systems
{ucbvax!nbires, seismo!hao!nbires, boulder}!cisden!aburt 



More information about the Comp.lang.c mailing list