Всегда ли тип сохраняется в памяти, используя его размер? - PullRequest
0 голосов
/ 12 июля 2020

Можно ли с уверенностью сказать, что переменные таких примитивных типов, как: 'char', 'short', 'int', 'long' и 'long long', всегда будут храниться в ОЗУ с учетом ее размера?

Например, long long будет сохранен с использованием 8 байтов, даже если его значение равно 15.

Ответы [ 3 ]

2 голосов
/ 12 июля 2020

Да и нет.

Да, потому что C ++ и C действительно предоставляют представление в памяти (некоторых) значений, и вы даже можете использовать memcpy для безопасного копирования байтов переменной в или из с определенными типами (типы «простых старых данных» POD).

Нет, потому что компилятору дается довольно большая свобода в том, что именно делать с сгенерированным кодом и, например, в такой функции, как:

int foo(int a, int b) {
    int c = a + b;
    return c;
}

скорее всего, c с любым достойным компилятором вообще не будет иметь места в ОЗУ и будет временно существовать в регистрах ЦП.

1 голос
/ 12 июля 2020

Да, можно с уверенностью сказать, что переменная хранится как размер своего типа данных. Причина в том, что если он хранится на основе своего значения, то переменная, значение которой не присвоено, никогда не будет существовать (это ложные переменные без значения, существующие с некоторым значением мусора).

0 голосов
/ 12 июля 2020

Можно ли с уверенностью сказать, что переменные примитивных типов, таких как: char, short, int, long и long long, всегда будут храниться в ОЗУ с учетом его размера?

Теоретически RAM не требуется для C ++.

Поскольку C ++ 11 - это спецификация , написанная на английском языке sh (в n3337 ), и этот стандарт даже не упоминает RAM. Насколько я понимаю C ++ 11, реализация C ++ может (в принципе) работать на механических компьютерах, как гипотетический расширенный вариант Аналитической машины Бэббиджа , и такой компьютер не имеет Модуль DRAM .

На практике большинство процессоров хранят переменную в ОЗУ, но обратите внимание, что UEFI или B IOS материнской платы (например, некоторые Asus ROG STRIX TRX40-E ), вероятно, написаны в основном на C или C ++ и могут работать без модулей DRAM (используя только процессор кеш-память ЦП ). Посмотрите также на coreboot .

Большинство оптимизирующих компиляторов (например, последние G CC, вызываемые как g++ -Wall -Wextra -g -O3) будет стараться удерживать автоматические c переменные в регистрах процессора .

Например, long long будет сохранено с использованием 8 байтов, даже если это значение равно 15.

Скорее всего, да, но тогда вам следует использовать стандартный std::int64_t тип .

Наконец, большинство программ на C ++ работать под управлением некоторой операционной системы с поддержкой виртуальной памяти , а иногда переменная даже не находится внутри ОЗУ (просто в области подкачки некоторого диска).

...