[Flac-dev] 64-bit FLAC structure sizes and padding

Erik de Castro Lopo mle+la at mega-nerd.com
Mon May 30 00:20:11 PDT 2011

Jerker Bäck wrote:

> Erik, thanks for the swift answer. Your right, I haven't seen any issues
> yet. But it a thought stroke me when implementing edit capabilities of FLAC
> vorbis comments. I've already implemented reading vorbis comments from FLAC
> files in 64-bit and it works without any issues. This now leave me a bit
> confused, since it should have issues(!).

No it shouldn't, at least not if FLAC was well designed and from
everything I've seen, FLAC is well designed.
> Using the MS 64-bit compiler on Windows 7/2008R2 64-bit. Static libFLAC
> compiled with compiler default 8 byte boundary alignment.
> Now consider this:
> typedef struct {
>     FLAC__uint32 length;
>     FLAC__byte *entry;
> } FLAC__StreamMetadata_VorbisComment_Entry;
> The compiler (with default settings) should interpret this as 
> typedef struct {
>     FLAC__uint32 length;
>     uint32_t __padding;
>     FLAC__byte *entry;
> } FLAC__StreamMetadata_VorbisComment_Entry;
> Sizeof structure: 32-bit - 8 bytes, 64-bit - 16 bytes
> How on earth does the compiler find entry correctly when reading (it does,
> but how)?

The compiler figures this out because the platform ABI [0]
specifies how much padding there is and all compilers should
follow the platform ABI.

Furthermore, the structs above are *only* for communication 
between the client application and the library. Those structs
are not actually used to store data in a FLAC file.


[0] https://secure.wikimedia.org/wikipedia/en/wiki/Application_binary_interface
Erik de Castro Lopo

More information about the Flac-dev mailing list