C++ 套接字:结构地址的大小

c++ socket: size of the structure addrinfo

本文关键字:地址 结构 套接字 C++      更新时间:2023-10-16

我正在使用 eclipse 和 cygwin。该应用程序是 64 位。在cygwin中,结构被定义为:

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 */
};

大小(地址信息)结果是48。socketlen_t的大小为 4 个字节。int 类型大小为 4 个字节。指针在 64 位应用程序中为 8 个字节。总字节数为 44(4 整数 = 16 字节,socket_len = 4 字节,3 指针 = 24;20+4+24 = 44)。我想知道缺少的 4 个字节有什么用?它们是用于填充的吗?我认为 44 字节不需要对齐。有什么想法吗?

提前感谢您的回答。

它是填充,在socklen_t之后。结构中的下一个变量是一个指针,其长度为 64 位,并且(在本例中)也将与 64 位对齐。但请注意,填充取决于体系结构和编译器设置;它发生在这里,但不能保证总是发生。

请注意,由于您正在与操作系统共享此结构,因此不应尝试自己更改填充(大多数编译器允许使用编译器开关和/或编译指示)。操作系统期望此结构包含一定量的填充。如果无法提供它,则结构末尾的所有指针的值都将被误解。

它是"结构成员对齐",/Zp 标志
数据结构对齐,
Microsoft文档