2016-02-13 49 views
4

我使用蝕與cygwin的。該應用程序是64位。在Cygwin中的結構被定義爲:C++插座:該結構的大小addrinfo中

struct addrinfo { 
    int    ai_flags;   /* input flags */ 
    int    ai_family;  /* address family of socket */ 
    int    ai_socktype;  /* socket type */ 
    int    ai_protocol;  /* ai_protocol */ 
    socklen_t  ai_addrlen;  /* length of socket address */ 
    char   *ai_canonname; /* canonical name of service location */ 
    struct sockaddr *ai_addr;   /* socket address of socket */ 
    struct addrinfo *ai_next;   /* pointer to next in list */ 
}; 

的的sizeof(addrinfo中)的結果是48。socketlen_t的大小爲4個字節。 int類型的大小是4個字節。指針在64位應用程序中是8個字節。總字節數爲44(4ints = 16字節,socket_len = 4字節,3指針= 24; 20 + 4 + 24 = 44)。我想知道缺少的4個字節是什麼?他們是否填充?我認爲44個字節不需要對齊。任何想法?

感謝提前答案。

回答

3

它的填料,socklen_t的後。結構中的下一個變量是一個指針,它的長度爲64位,並且(在這種情況下)也將與64位對齊。但請注意,填充取決於體系結構和編譯器設置;它發生在這裏,但並不保證總會發生。

注意,由於您使用的操作系統共享這個結構,你不應該試圖改變自己的襯墊(大多數編譯器允許使用該編譯器開關和/或編譯指示)。操作系統期望這個結構包含一定數量的填充。如果你沒有提供它,那麼結構末尾的所有指針都會錯誤地解釋它們的值。

+1

感謝您的回答,使用gcc編譯器,是有可能的填充,可以刪除嗎? – r0ng

+1

是的;請參閱https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Structure-Packing-Pragmas.html。但是請注意,如果您對操作系統指定的結構(該addrinfo是!)執行此操作,則會導致未定義的行爲,如第二段所述。 –