sizeof() Windows/Linux gibt andere Werte?
-
Hi, und zwar erhalte ich vom g++/VC++ unterschiedliche ergebnisse bei:
// TCP header. Per RFC 793, September, 1981. In Little Endian typedef struct tcphdr { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ u_char th_x2:4, /* (unused) */ th_off:4; /* data offset */ u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ } tcphdr, *tcphdr_ptr; .... printf( "%i", (int)sizeof(tcphdr));
Unter VC++: 20 bytes
Unter g++: 32 bytes
-
Das liegt am Padding.
-
20 bytes ist jedenfalls der richtige wert.
-
zähl-freak schrieb:
20 bytes ist jedenfalls der richtige wert.
erklär mal das warum
-
das soll doch ein tcphdr sein.
--> http://www.faqs.org/rfcs/rfc793.html
guckst du 3.1. alles nach dem 'urgent pointer' ist optional. d.h. 5*4 bytes == 20.
-
struct tcphdr { // ... } __attribute((packed)); typedef struct tcphdr tcphdr;
So solltest du Padding verhindern können.
-
wie wärs mit #pragma pack(x) ? das funktioniert auch mit beiden compilern
-
packer schrieb:
wie wärs mit #pragma pack(x) ? das funktioniert auch mit beiden compilern
neuerdings, der GCC war nicht immer so schlau
Ich glaub er sieht es aber noch immer als "unschön" an. Selbiges gilt für #pragma once.
-
GCC'ler schrieb:
packer schrieb:
wie wärs mit #pragma pack(x) ? das funktioniert auch mit beiden compilern
neuerdings, der GCC war nicht immer so schlau
Ich glaub er sieht es aber noch immer als "unschön" an. Selbiges gilt für #pragma once.
Was heißt hier schlau? Ich finde es unschön, solche proprietären Konstrukte zu unterstützen. Das verwässert nur den Standard. Ich finde es toll, dass die GCC-Leute versuchen, möglichst nah an den Standard zu kommen und sogar Inkompatibilitäten mit ihren eigenen Versionen akzeptieren.