Почему две переменные, объявленные одна за другой, не находятся рядом друг с другом в памяти? - PullRequest
1 голос
/ 15 октября 2019

Я использую пример кода для проверки расстояния между двумя целыми числами, как в ответе на этот вопрос .

int i = 0, j = 0;
std::cout << &i - &j;

Из моего представления о представлении памяти эти адреса памятииз этих двух переменных должны быть рядом друг с другом, и разница должна быть ровно 1.

К моему удивлению, запуск этого кода с компилятором MS в VS2017 печатает 3 и запуск того же кода сGCC печатает 1 .

Почему это происходит, что-то не так с VS?

Ответы [ 2 ]

5 голосов
/ 15 октября 2019

Стандарт C ++ не предъявляет никаких требований к компиляторам C ++ для выделения переменных с автоматической продолжительностью хранения каким-либо конкретным способом, включая их непрерывное хранение в памяти. Фактически, компилятор может решить не выделять какую-либо память для переменной, полностью оптимизируя ее.

Именно поэтому вычитание указателей имеет смысл только тогда, когда они оба указывают на память внутри одного массива или на один элемент послеконец этого. Во всех других ситуациях, включая вашу, вы получаете неопределенное поведение.

3 голосов
/ 15 октября 2019

Указатель арифметика , которую вы пробовали, имеет неопределенное поведение:

Если указатель P указывает на i-й элемент массива, а указатель Q указывает на j-й элементв том же массиве выражение PQ имеет значение ij, если значение помещается в std :: ptrdiff_t. Оба операнда должны указывать на элементы одного и того же массива (или одного после конца), в противном случае поведение не определено. Если результат не помещается в std :: ptrdiff_t, поведение не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...