Смущающий вывод? - PullRequest
       2

Смущающий вывод?

1 голос
/ 01 сентября 2010

Я не могу понять, почему код печатает '3' в VS2010 (сборка выпуска), оставляю ли я объявление 'r' или комментирую его.:

a.почему код печатает 3?

b.почему он печатает 3, даже если присутствует объявление 'r'?(Это потому, что в C ++ ссылка занимает память или нет, определяется реализацией?)

c.Имеет ли этот код неопределенное поведение или поведение, определяемое реализацией?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Потому что в Release build переменная r удалена.Неиспользуемая переменная встроенного типа удаляется, так как сборка выпуска выполняется с оптимизацией.Попробуйте использовать его позже, и результат изменится.Некоторые переменные могут быть помещены в регистр процессора, а не в стек, это также изменяет расстояние между другими локальными переменными.

С другой стороны, неиспользуемый экземпляр класса не удаляется, поскольку создание экземпляра класса может иметь побочные эффекты, поскольку вызывается конструктор.

Это поведение не определено и определяется реализацией, поскольку компилятор может свободно размещать переменные в любом месте, где это уместно.

2 голосов
/ 01 сентября 2010

а.Порядок переменных в памяти:

arr2[0]
arr2[1]
arr1[0]
arr1[1]

, код печатает 3, потому что он использует арифметику указателей.Вычитание & arr1 [1] из & arr2 [0] означает разницу в 3 целых.

b.Поскольку на r никогда не ссылаются, компилятор C ++ может оптимизировать его.

c.Не позитивно, но я не верю, что стандарт C ++ определяет явный порядок переменных в стеке.Поэтому компилятор может свободно переупорядочивать эти переменные, даже помещая дополнительное пространство между ними так, как считает нужным.Так что да, его реализация специфична.Другой компилятор мог бы так же легко дать -1, как и ответ.

0 голосов
/ 01 сентября 2010

&arr1[1] - &arr2[0]

Арифметика указателей четко определена только в одном массивеНеважно, что вы думаете или должен делать этот фрагмент кода, вы вызываете неопределенное поведение.Ваша программа может сделать что угодно .

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