При использовании Compiler Explorer я заметил, что char
всегда смещается на 1
от предыдущей позиции. Например:
int main() {
char a = 1;
char b = 2;
char c = 3;
char d = 4;
char e = 5;
return a + b + c + d + e;
}
main:
...
movb $1, -1(%rbp)
movb $2, -2(%rbp)
movb $3, -3(%rbp)
movb $4, -4(%rbp)
movb $5, -5(%rbp)
Однако в следующем примере для short
, почему он смещен на 4, а не на 2?
int main() {
char b = 2;
short c = 2;
return b;
}
main:
...
movb $2, -1(%rbp)
movw $2, -4(%rbp) <-- why isn't this offset by 2?
I подумайте над ответом, потому что, поскольку это два байта, он должен соответствовать адресам памяти 3 и 4, поэтому, если бы он был на 2, у него не было бы достаточно места с уже занятым 1, но я не слишком уверен. Каковы «правила» того, как байты заполняются / по какому смещению они добавляются?