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));
手动偏移是在编译时解决的,还是在运行时增加了执行算术运算的开销?
即使您有一个常量而不是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));
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