Сводка: я смотрел на код сборки, чтобы вести оптимизацию и видеть много знаков или нулевых расширений при добавлении int32 к указателю.
void Test(int *out, int offset)
{
out[offset] = 1;
}
-------------------------------------
movslq %esi, %rsi
movl $1, (%rdi,%rsi,4)
ret
Сначала мне показалось, что моему компилятору было предложено добавить от 32 до 64-битных целых чисел, но я подтвердил это поведение с Intel ICC 11, ICC 14 и GCC 5.3.
Этот поток подтверждает мои выводы, но неясно, требуется ли знак или нулевое расширение. Это расширение знака/нуля было бы необходимо только в том случае, если верхние 32 бита еще не установлены. Но не будет ли x86-64 ABI достаточно умен, чтобы требовать этого?
Я вроде бы не хочу менять все смещения указателя на ssize_t, поскольку разливы регистров увеличивают размер кэша кода.