Сколько выделенного пространства имеют константы? - PullRequest
1 голос
/ 23 января 2020

Мой преподаватель по ИТ сказал, что когда пространство выделено для константы в C и C ++, выделяется только СТРОГО необходимое пространство: он сказал, что если мы сохраняем значение 12 в константе, например, только 4 бита памяти будет выделено. Я полагаю, что это не так, потому что память почти всегда делится на 8-битные «ячейки», и потому что, когда мы объявляем константу, мы также указываем ее тип, поэтому мы решаем, сколько памяти ей выделить. Есть мнение эксперта?

PS: он говорил о константах, объявленных с помощью квалификатора const.

Ответы [ 3 ]

5 голосов
/ 23 января 2020

Конечно, ваш учитель информатики не прав. Размер зависит от типа значения const. Но вы также должны помнить, что оптимизирующий компилятор может удалить любые объекты, если они не нужны.

3 голосов
/ 23 января 2020

оба, потому что память почти всегда делится на 8-битные "ячейки"

Это данные память обычно находится в 8-битных ячейках.

При int x = 12 в C константа 12 не указана для сохранения в памяти в качестве данных. Все, что требуется, это x принимает значение 12 - каким-то образом.

12 может быть встроено как часть инструкции - возможно, только в несколько битов.

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

This обычно случается со специальными значениями, такими как 0. В каком-то месте не хранится 0, занимающий 8 бит данных, так как, скорее всего, есть инструкция, чтобы просто «очистить» x.

2 голосов
/ 23 января 2020

Мой преподаватель по ИТ сказал, что когда пространство выделяется для константы в C и C ++, выделяется только СТРОГО необходимое пространство: он сказал, что если мы сохраняем значение 12 в константе, для Например, будет выделено только 4 бита памяти.

Если это действительно то, что сказал инструктор, то для этого действительно нет оправдания.

Нет смысла Это связано с тем, что память почти всегда делится на 8-битные «ячейки», а также потому, что когда мы объявляем константу, мы также указываем ее тип, поэтому мы решаем, сколько памяти ей выделить. Любое мнение эксперта?

Ни стандарт C, ни языковой стандарт C ++ не дают никакого обоснования для утверждения, и на практике он не описывает реальные реализации.

Но на самом деле, условия, в которых заявлено требование, должны быть оспорены, прежде чем мы даже дойдем до этого. В C «константой» является буквенная цифра c или значение нулевого указателя, встречающееся в исходном коде. Реализация языка имеет свободу действий для алгебраического объединения констант, их кодирования в инструкции, а не в данные, и для выполнения других преобразований, которые фактически означают, что константа вообще не соответствует ни одному хранилищу. Там, где константы имеют соответствующее представление в оперативной памяти, это представление действительно связано с архитектурой системы, и я не знаю какой-либо современной компьютерной архитектуры, которая может адресовать хранилище в единицах, меньших восьми бит.

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

struct example {
    unsigned int two_bits:2;
};

Битовые поля сами по себе не адресуемы - вы не можете применять к ним оператор адреса (&) - и язык признает, что их хранилище является частью одного или нескольких анонимные «адресуемые единицы хранения», которые обычно больше, но представление каждого члена поля битов структурного объекта определено как состоящее из определенного c количества битов, объявленных для него.

...