2014-08-28 2 views
0

Предположим, что две переменные:Как декларациях работает в памяти

int x = 10; 
    float y = 10.5; 

оба 4 байта выделены в памяти, , но как это работает, так как операции с междунар и поплавком разные?

Следуя той же логике:

Animal * d = new Dog(); 

Animal является указателем, который указывает на собаку, но указатель 4 байта и хранит адрес. Как он знает, что он животное? Так что позже вы можете сделать d.sound();

+3

Короткий ответ заключается в том, что компилятор знает, какой тип вы объявили, и обрабатывает переменную в соответствии с этим типом (например, генерирует целые инструкции для переменных «int» и команд с плавающей запятой для переменных «float»). Длительный ответ заполнил бы книгу. –

+0

Это распространяется на любую достойную книгу C++ или справочный сайт. Вы должны найти его; Google и Bing отлично подходят для поиска веб-сайтов, а места, подобные Amazon, позволяют вам искать книги по теме и даже сортировать результаты по рейтингам рецензента. (Краткий ответ: компилятор предназначен для понимания кода и создания правильных распределений и ассоциаций.) –

+1

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

ответ

0

Декларация говорит компилятору две вещи:

  1. Сколько памяти для выделения переменной.

  2. Какой код генерировать при выполнении вычислений с использованием переменной.

Так что, когда вы используете выражение как x + 6, компилятор будет выдавать код, который использует инструкции целое добавляемого процессора. Когда вы используете y + 6, он испускает код, который использует инструкцию добавления с плавающей запятой.

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

void floatfun(float z); 

и вы называете floatfun(x), компилятор генерирует код, который вычисляет точку эквивалент плавающей стоимости x «s, и передать функции.

Когда тип является структурой или классом, объявление также позволяет компилятору определить, какие члены могут использоваться, и как переводить имена членов в код, который обращается к ним. Компилятор также знает о взаимосвязи между базовыми классами и производными классами, поэтому он знает, что вы можете назначить Dog* на Animal* и выполняет соответствующие преобразования (в C++ это связано с структурой данных, называемой vtable).

+0

compiler = magic (пока), спасибо! – 2014-08-28 01:51:06

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