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));
手動偏移量是在編譯時解析還是增加了在運行時執行算術運算的開銷?C/C++在編譯時解決地址偏移問題嗎?
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));
手動偏移量是在編譯時解析還是增加了在運行時執行算術運算的開銷?C/C++在編譯時解決地址偏移問題嗎?
即使y你有一個常數而不是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
你爲什麼不看組裝製作和判斷你自己?目前還不清楚你說的是什麼抵消,它可能取決於你的編譯器和優化設置。 – Mat 2012-07-15 10:35:47
我在說p偏移指針的地址。 – dtech 2012-07-15 10:37:44
其中有三個,一個在循環中。以上我的評論適用於:檢查你的編譯器產生什麼。 – Mat 2012-07-15 10:38:52