On Fri, Mar 24, 2006 at 06:03:49PM +0100, Joerg Schilling wrote:
>Steve Bennett <[EMAIL PROTECTED]> wrote:
>
>> Joerg Schilling wrote:
>> > Did  you test with a recent GCC using 
>> > 
>> > #pragma pack(1)
>> > 
>> > I would expect that this also results in reduced sizes.
>>
>> Yes, I certainly have tested it (and Steve said he had too).
>> It does not work.
>
>"Does not work" does not really help.....
>
>> > <nslu2> gcc -dumpversion
>> > 4.0.3
>>
>> Which is just about as recent as it gets.
>>
>> I believe that #pragma pack(1) affects inter-field padding,
>> but does not affect padding at the end of structures.
>
>From the forst text from you, I asume that the problem is that the size
>of char[4] is not 4 but 16.

No, it's not.

>So where is the real problem?

Quick demonstration:

1. gcc on an i386 box:

smcintyre:~$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang
--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared
--enable-__cxa_atexit --with-system-zlib --enable-nls
--without-included-gettext --enable-clocale=gnu --enable-debug
--enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc
i486-linux
Thread model: posix
gcc version 3.3.5 (Debian 1:3.3.5-13)
smcintyre:~$ uname -a
Linux smcintyre 2.6.13 #5 SMP Mon Sep 26 16:04:46 BST 2005 i686
GNU/Linux
smcintyre:~$ ./wibble 
sizeof(test1) is 10
sizeof(test2) is 10

2. gcc on an arm box:

[EMAIL PROTECTED]:~$ gcc -v
Reading specs from /usr/lib/gcc-lib/arm-linux/3.3.5/specs
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f77,pascal,objc,treelang --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared
--enable-__cxa_atexit --with-system-zlib --enable-nls
--without-included-gettext --enable-clocale=gnu --enable-debug
--enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc
arm-linux
Thread model: posix
gcc version 3.3.5 (Debian 1:3.3.5-13)
[EMAIL PROTECTED]:~$ uname -a
Linux grieg 2.4.27-netwinder #1 Sun Dec 4 21:39:55 UTC 2005 armv4l
GNU/Linux
[EMAIL PROTECTED]:~$ ./wibble 
sizeof(test1) is 10
sizeof(test2) is 12

Both are using the following source:

#include <stdio.h>

struct test1
{
    char blerg[1];
    char type[4];
    char flibble[3];
    char more[2];
} __attribute__((packed));

#pragma pack(1)

struct test2
{
    char blerg[1];
    char type[4];
    char flibble[3];
    char more[2];
};

int main (int argc, char **argv)
{
    printf("sizeof(test1) is %d\n", sizeof(struct test1));
    printf("sizeof(test2) is %d\n", sizeof(struct test2));
    
    return 0;
}

As the link that I posted up-thread said, #pragma pack(1) does not
force alignment within a structure on arm, as that would clash with
the arm ABI. If you _must_ do things that way, you have to use
__attribute__((packed)). Better/more portable would be to have a
simple byte array rather than a packed structure.

-- 
Steve McIntyre, Cambridge, UK.                                [EMAIL PROTECTED]
There's no sensation to compare with this
Suspended animation, A state of bliss



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to