LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

`struct x { union { struct { int i; … char buf[]; }; }; char _[4096];

Заполнитель _[4096] перемести внутрь union и всё будет работать.

#include <stdio.h>

struct x { 
  union { 
    struct { 
      int i; 
      char x; 
      float p; 
      long m; 
      char buf[64]; 
    };  
    char _[4096];
  }; 
};

int main(int argc, char *argv[])
{
    struct x y;
    y.i=12;
    y.x=13;
    y.p=0.4;
    y.buf[0]='l';
    y.buf[1]='o';
    y.buf[2]='\n';
    printf("%zu %d %d %f %s\n",sizeof(y),y.i,y.x,y.p,y.buf);
    return 0;
}
dron@gnu:~$ gcc cc.c
dron@gnu:~$ ./a.out 
4096 12 13 0.400000 lo

dron@gnu:~$ gcc -g3 -c cc.c
dron@gnu:~$ pahole cc.o 
struct x {
	union {
		struct {
			int        i;                    /*     0     4 */
			char       x;                    /*     4     1 */

			/* XXX 3 bytes hole, try to pack */

			float      p;                    /*     8     4 */

			/* XXX 4 bytes hole, try to pack */

			long int   m;                    /*    16     8 */
			char       buf[64];              /*    24    64 */
		};                                       /*     0    88 */
		char               _[4096];              /*     0  4096 */
	};                                               /*     0  4096 */

	/* size: 4096, cachelines: 64, members: 1 */
};
dron@gnu:~$ 

Исправление LINUX-ORG-RU, :

`struct x { union { struct { int i; … char buf[]; }; }; char _[4096];

Заполнитель _[4096] перемести внутрь union и всё будет работать.

#include <stdio.h>

struct x { 
  union { 
    struct { 
      int i; 
      char x; 
      float p; 
      long m; 
      char buf[64]; 
    };  
    char _[4096];
  }; 
};

int main(int argc, char *argv[])
{
    struct x y;
    y.i=12;
    y.x=13;
    y.p=0.4;
    y.buf[0]='l';
    y.buf[1]='o';
    y.buf[2]='\n';
    printf("%zu %d %d %f %s\n",sizeof(y),y.i,y.x,y.p,y.buf);
    return 0;
}
dron@gnu:~$ gcc cc.c
dron@gnu:~$ ./a.out 
4096 12 13 0.400000 lo

dron@gnu:~$ gcc -g3 -c cc.c
dron@gnu:~$ pahole cc.o 
struct x {
	union {
		struct {
			int        i;                    /*     0     4 */
			char       x;                    /*     4     1 */

			/* XXX 3 bytes hole, try to pack */

			float      p;                    /*     8     4 */

			/* XXX 4 bytes hole, try to pack */

			long int   m;                    /*    16     8 */
			char       buf[64];              /*    24    64 */
		};                                       /*     0    88 */
		char               _[4096];              /*     0  4096 */
	};                                               /*     0  4096 */

	/* size: 4096, cachelines: 64, members: 1 */
};
dron@gnu:~$ 

Исходная версия LINUX-ORG-RU, :

`struct x { union { struct { int i; … char buf[]; }; }; char _[4096];

Заполнитель _[4096] перемести внутрь union и всё будет работать.