在C / C ++的编译期间是否解决了地址偏移?

时间:2012-07-15 10:33:16

标签: c++ c memory offset resolve

void *p = malloc(1000);
*((int*)p) = 666;
*((int*)p+sizeof(int)) = 777;
int i;
for (i = 0; i<10; ++i)
    printf("%d ", *((int*)p+sizeof(int)*i));

手动偏移是在编译时解决还是增加了在运行时执行算术运算的开销?

2 个答案:

答案 0 :(得分:3)

即使您有一个常量而不是sizeof(int),编译器也无法提前知道p中的地址,因此必须进行添加。如果您有类似i = sizeof(int)+4的内容,那么它应该执行优化编译时间并直接将i设置为8

另外,我想你做的时候:

*((int*)p+sizeof(int)) = 777;
你的意思是:

*((int*)p + 1) = 777; /* or ((int*)p)[1] = 777; */

同样printf("%d ", *((int*)p+sizeof(int)*i));应为:

printf("%d ", *((int*)p + i));

答案 1 :(得分:2)

sizeof(int)在编译时肯定是已知的,因此有效利用这些信息是有意义的。但是,不能保证给定的编译器会生成如下内容:

mov dword [ebx+16], 777

而不是像这样:

mov ecx, 16
mov dword [ebx+ecx], 777

lea ebx, [ebx+16]
mov dword [ebx], 777

甚至

add ebx, 16
mov dword [ebx], 777