Разрешены ли смещения адресов во время компиляции в 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
Другие вопросы по тегам