Я использую Visual Studio 2019 и заметил, что в отладочных сборках переменные расположены так далеко друг от друга. Я посмотрел на Project Properties и попытался найти в Интернете, но ничего не смог найти. Я запустил следующий код ниже в режимах отладки и выпуска, и вот соответствующие результаты.
int main() {
int a = 3;
int b = 5;
int c = 8;
int d[5] = { 10,10,10,10,10 };
int e = 14;
std::cout << "a: " << &a
<< "\nb: " << &b
<< "\nc: " << &c
<< "\nd_start: " << &d[0]
<< "\nd_end: " << &d[4] + 1
<< "\ne: " << &e
<< std::endl;
}
Как вы можете видеть ниже, переменные распределяются так, как вы ожидаете (одна за другой) без потерь память между ними. Даже последняя переменная, e
, оптимизирована для слота между c и d.
// Release_x64 Build Ouput
a: 0000003893EFFC40
b: 0000003893EFFC44
c: 0000003893EFFC48
d_start: 0000003893EFFC50
d_end: 0000003893EFFC64
e: 0000003893EFFC4C // e is optimized in between c and d
Ниже приведен вывод, который меня смущает. Здесь вы можете видеть, что a
и b
расположены на расстоянии 32 байта! Таким образом, между ними находится 28 байт потерянной / неинициализированной памяти. То же самое происходит с другими переменными, за исключением int d[5]
. d
имеет 32 неинициализированных байта после c
, но имеет только 24 неинициализированных байта до e
.
// Debug_x64 Build Output
a: 00000086D7EFF3F4
b: 00000086D7EFF414
c: 00000086D7EFF434
d_start: 00000086D7EFF458
d_end: 00000086D7EFF46C
e: 00000086D7EFF484
Мой вопрос таков: почему это происходит? Почему MSV C распределяет эти переменные так далеко друг от друга и что определяет, на сколько места их разделить, чтобы они отличались для массивов?