结构体
typedef struct A {
short short_num;
int int_num;
} A;
A结构体为8字节, short_num自动补齐到4字节,
而多余的2个字节,不会自动置为0
如:
#include <stdio.h>
typedef struct A {
short short_num;
int int_num;
} A;
int main() {
A a;
a.short_num = 3;
a.int_num = 3;
printf("%d,%d\n", a.short_num, a.int_num);
return 0;
}
通过gcc -S得到汇编代码:
subq $16, %rsp
movw $3, -16(%rbp)
movl $3, -12(%rbp)
其中movw是16位, movl是32位,其中均是将3赋值,但是中间没有任何置0的操作。
另通过gdb查看
(gdb) x/8xb &a
0x7fffffffdbc0: 0x03 0x00 0xff 0xff 0x03 0x00 0x00 0x00
系统环境为小端:因此这里的short_num对应的为 0x03 0x00 0xff 0xff, 可见补齐的两个字节并没有置0,还有可能是其他的数值
因此对于有补齐类型的结构体,其是不能通过判断内存存储的值是否相等而判断两个结构体是否相等的。
在实现map的key时可能更需要注意到这点。