鉴于:A = 5且B = 9,......之间的差距是什么?
在Chegg上找到了这个答案,但我不确定它是否正确。
- w和x = w之间的间隙是一个大小为30的字符数组,但在32位处理器中x为7 + 1位的整数
- y和p = y之间的间隙是大小为6的短数组,但p是整数
- p和z之间的间隙= p是整数,但z是大小为6的双数组
- z和q = z之间的间隙是维度6的双数组,但q是短变量
typedef struct {
char w[A][B];
int x;
} str1;
typedef struct {
short y[B];
int p;
double z[B];
short q;
} str2;
void doSub(str1 *t, str2 *u) {
int v1 = u->p;
int v2 = u->q;
t->x = v1-v2;
}
# t in %rdi, u in %rsi
doSub:
movswl 96(%rsi), %edx
movl 20(%rsi), %eax
subl %edx, %eax
movl %eax, 48(%rdi)
ret
答案 0 :(得分:1)
w和x
w
的大小为5*9=45
,但x
需要4
字节的对齐,因此差距将为3
个字节。也可以在访问48
的偏移x
的程序集中看到。
y和p
y
的大小为9*2=18
,p
需要与4
字节对齐,因此差距为2
。也可以在汇编代码中看到访问偏移量20
。
p和z
p
的尺寸为4
,因此以偏移24
结束。 q
位于偏移96
(在程序集中看到),z
的大小为9*8=72
,因此z
从96-72=24
开始。因此,差距为0
。 (double
的对齐可能会有所不同,因此从汇编代码向后工作。)
z和q
由于q
很短并且只与2
个字节对齐,因此z
之后没有差距。
答案 1 :(得分:0)
#include <stddef.h>
printf("w to x: %lu\n", offsetof(str1, x) - offsetof(str1, w));
printf("y to p: %lu\n", offsetof(str2, p) - offsetof(str2, y));
printf("p to z: %lu\n", offsetof(str2, z) - offsetof(str2, p));
printf("z to q: %lu\n", offsetof(str2, q) - offsetof(str2, z));
以任何有意义的方式依赖结果数字通常是一个坏主意。