Расстояние между переменными в памяти

Интересно, как C ++ обрабатывает переменные так, чтобы расстояние между двумя адресами в памяти целочисленных переменных, объявленных и инициализированных одна за другой, составляло 3537492 — 3537480 = 12 (я предполагаю биты (?))

#include <cstdio>

using namespace std;

int main( int argc, char ** argv )
{
int x = 1;
int y = 2;

printf("int:\t%d\n", sizeof(int));
printf("unsigned int:\t%d\n", sizeof(unsigned int));

printf("Address of x\n\tHex:\t%p\n\tDec:\t%d\n", &x, &x);
printf("Address of y\n\tHex:\t%p\n\tDec:\t%d\n", &y, &y);

return 0;
}

Выход:

int: 4
без знака int: 4
Адрес х
Hex: 0035FA54
Дек: 3537492
Адрес у
Hex: 0035FA48
Дек: 3537480

1

Решение

мой Угадай было бы то, что компилятор выравнивает целые числа по границе слова по какой-то причине производительности. Если слово составляет 128 бит или 16 байтов, то такое поведение приведет к расстоянию между переменными 12 байтов. Чтобы понять, прав ли я, вам нужно немного больше понять архитектуру, которую вы собираете. Не каламбур предназначен. Увидеть http://en.wikipedia.org/wiki/Data_structure_alignment

1

Другие решения

Расстояние между двумя переменными в памяти чаще всего является бессмысленным числом. Основным исключением являются два элемента массива.

Это не исключение: число, которое вы получите, по стечению обстоятельств равно 12. Если вы попытаетесь посчитать его «синим», технически это будет юридический результат. Это потому, что сравнение несвязанных указателей является неопределенным поведением, и тогда буквально все может произойти.

Кроме того, значения, которые вы получаете, могут варьироваться от запуска к запуску. (Во многих современных операционных системах это имеет место по соображениям безопасности. Трудно взломать программу, когда она постоянно перемещается)

1

Я полагаю, вы скомпилировали этот код в Visual Studio отлаживать конфигурации. В этом режиме компилятор делает дополнительное распределение памяти между вашими переменными, чтобы обнаружить возможное повреждение стека. Попробуйте перейти на Релиз и вы увидите, что расстояние становится 4 байта, как и должно быть.
Больше информации по теме:
https://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx

1