digitalmars.D.learn - structure alignment issues?
- akcom <CppCoder gmail.com> May 31 2006
- akcom <CppCoder gmail.com> May 31 2006
- "Regan Heath" <regan netwin.co.nz> May 31 2006
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?
May 31 2006
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?
May 31 2006
On Wed, 31 May 2006 20:31:42 -0400, akcom <CppCoder 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
May 31 2006








"Regan Heath" <regan netwin.co.nz>