Разрешены ли смещения адресов во время компиляции в 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));
Разрешается ли ручное смещение во время компиляции или это увеличивает накладные расходы на выполнение арифметических операций во время выполнения?
2 ответа
Даже если у вас есть константа вместо 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