2015-05-21 3 views
0

Рассмотрим эти 2 файла:Как указатели и ссылки сохраняются в памяти

//main1.cpp 

int main() 
{ 
    int a = 0; 
    int &b = a; 
} 

//main2.cpp 

int main() 
{ 
    int a = 0; 
    int *b = &a; 
} 

И когда я скомпилировать его с gcc -S вариант и сравнить 2 ассемблер выходы, они были точно такими же выходами. Итак, почему некоторые книги говорят, что ссылочные переменные не используют дополнительную память?

+0

Оптимизация, специфичная для компилятора, возможно ... –

+4

«Почему в некоторых книгах говорят, что ссылочные переменные не являются дополнительной памятью?» Потому что они не знают, о чем они говорят. Получите [лучшую книгу] (http://stackoverflow.com/questions/388242). (Кроме того, для примера, подобного этому, весь код, вероятно, удален, так как он ничего не делает). –

+4

Семантически, ссылки не должны занимать память. У них, конечно, нет адреса. Но под капотом указатели могут использоваться при реализации, если это необходимо. Реализация может делать все, что ему нужно, для создания требуемой семантики. – juanchopanza

ответ

10

Не указано, относится ли эта ссылка к памяти. Если компилятор может определить, к какому объекту он относится, он может просто использовать ссылку в качестве альтернативного «имени» для этого объекта, без необходимости какой-либо информации времени выполнения. Если он не может, тогда ссылка должна будет содержать адрес своей цели, точно так же, как указатель.

Указатели - это объекты, поэтому они занимают память, как и любой другой объект. Однако оптимизация в соответствии с правилом «как будто» означает, что объекты должны занимать память только в том случае, если поведение программы зависит от их выполнения; например, если вы печатаете свой адрес. Поэтому, если компилятор может определить, к какому объекту указывает указатель, он может заменить косвенный доступ через указатель с прямым доступом к этому объекту и, возможно, полностью удалить указатель.

То же правило оптимизации означает, что в обоих примерах все переменные могут быть удалены, так как они не имеют никакого эффекта.

+5

Последние двадцатые ответы, которые я видел из вас, были действительно звездными. –

+0

@LightnessRacesinOrbit: Спасибо, очень любезно с тобой сказать. –

+0

Добро пожаловать. –

Смежные вопросы