structure alignment issues?
Regan Heath
regan at netwin.co.nz
Wed May 31 17:44:43 PDT 2006
On Wed, 31 May 2006 20:31:42 -0400, akcom <CppCoder at gmail.com> wrote:
> akcom wrote:
>> Translating the following from windows:
>> --- C Code:
>> #define IMAGE_SIZEOF_SHORT_NAME 8
>> typedef struct _IMAGE_SECTION_HEADER {
>> BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
>> union {
>> DWORD PhysicalAddress;
>> DWORD VirtualSize;
>> } Misc;
>> DWORD VirtualAddress;
>> DWORD SizeOfRawData;
>> DWORD PointerToRawData;
>> DWORD PointerToRelocations;
>> DWORD PointerToLinenumbers;
>> WORD NumberOfRelocations;
>> WORD NumberOfLinenumbers;
>> DWORD Characteristics;
>> } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
>> #define IMAGE_SIZEOF_SECTION_HEADER 40
>> --- D Code:
>> const uint IMAGE_SIZEOF_SHORT_NAME = 8;
>> const uint IMAGE_SIZEOF_SECTION_HEADER = 40;
>> align struct ImageSectionHeader
>> {
>> BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
>> union Misc
>> {
>> DWORD PhysicalAddress;
>> DWORD VirtualSize;
>> }
>> DWORD VirtualAddress;
>> DWORD SizeOfRawData;
>> DWORD PointerToRawData;
>> DWORD PointerToRelocations;
>> DWORD PointerToLinenumbers;
>> WORD NumberOfRelocations;
>> WORD NumberOfLinenumbers;
>> DWORD Characteristics;
>> }
>> alias ImageSectionHeader IMAGE_SECTION_HEADER;
>> alias ImageSectionHeader *PIMAGE_SECTION_HEADER;
>> the problem is that ImageSectionHeader.sizeof == 36
>> Any ideas as to why?
>
> edit:
> it appears as if when the union is replaced by a single DWORD,
> everything works as expected. Should this be filed as a bug?
No. The D struct you give above declares a type called "Misc" which is a
union containing 2 DWORDS, but, you don't actually declare a struct member
of that type. In short, your struct does not contain the union at all,
only it's type declaration.
You have 2 options:
struct ImageSectionHeader
{
..
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
}
..
}
this is an anonymous union, of 2 DWORDS, or:
struct ImageSectionHeader
{
..
union NAMED_BOB { //creates type called NAMED_BOB
DWORD PhysicalAddress;
DWORD VirtualSize;
}
NAMED_BOB Misc; //includes a NAMED_BOB in the struct, called 'Misc'
..
}
both of these give a sizeof 40 for me.
Regan
More information about the Digitalmars-d-learn
mailing list