C++ 套接字:结构地址的大小
c++ socket: size of the structure addrinfo
我正在使用 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文档
相关文章:
- 使用内存地址访问结构的属性值
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 指向结构的指针向量的元素具有相同的地址
- 如何获取结构体成员的地址
- 释放指向保留嵌套变量内存地址的结构的指针
- C++可以输出一个结构的内存地址吗
- 使用来自 C 的内存地址的 Julia 读取/写入结构数据
- 结构指针在"新"调用上给出已分配的地址?
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 不太明白 & 运算符的地址在这个结构中做什么,以及它如何能够访问其他成员变量
- 函数中的结构指针的地址为0x1
- 无法找出此错误(将结构数组传递给函数):线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x1)
- C :变量的点地址至指针结构成员的地址
- 结构成员的地址作为编译时间常数之间的差异
- 将结构元素地址设置为C 中的null(单链接列表)
- 将地址分配给结构内的指针
- 映射文件中成员结构的地址
- 定义一个C宏并将内存地址设置为用C和C++编写的结构成员
- C 在8086中获取类/结构地址