如果我有一些整数,那就让我们说:
int iarr[5] = {0, 7, 3, 12, 99};
地址0xbfdf53a8
出现;我想用循环打印出这个值,我可以做这样的事情:
for(i=0; i<5; i++)
printf("value of iarr[%d] = %d\n", i, *(iarr+i));
这个循环有效,因为我们每次都递增一个“int”(在典型的32位机器上,每次迭代地址都会被4个字节压缩)。
我的问题是,什么时候应用了指定的字节偏移类型?这是编译过程的一部分(意味着它在某个程序集中),还是在操作系统级别完成?
我会假设这是如何以标准化方式处理的,但我还没有找到答案。
答案 0 :(得分:3)
这是编译过程的一部分,编译器会生成考虑操作数大小的代码。
请注意,您可以使用指向5412字节struct
的指针进行递增和算术运算,就像指向4字节int
的指针一样容易。编译器检查指针表达式的类型并生成正确的代码。
操作系统根本不涉及这些低级细节,从它的角度来看它只是代码。
答案 1 :(得分:1)
它在编译时完成,并且将在生成的程序集(和目标代码)中完成。
操作系统不知道(并且不关心)您正在操作的数据类型。它只会为你提供(虚拟)原始内存块。
只有您和编译器知道数据类型及其特征。