Переменные, содержащие пустое значение, также занимают место в ram? - PullRequest
0 голосов
/ 12 декабря 2018

На любом языке программирования, если я установлю переменную:

name = 'Jhon';

Итак, она будет занимать 4 байта пространства в ОЗУ.Но что, если:

name = '';

Он все равно будет содержать пустую область в RAM или каков будет сценарий?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

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

int main( void )
{
  int x;
  int y;

  y = some_value();
  printf( "y = %d\n", y );
  return 0;
}

, на переменную x никогда не ссылаются, и она не играет никакой роли в вычислении или отображении y (мы предполагаем, что она не видима для some_value()).В этом случае компилятор может не выделять для него места.

Аналогично, в такой программе, как

int main( void )
{
  int y = 0;
  printf( "y = %d\n", y );
  return 0;
}

, компилятор может определить, что это точно так же, как запись

int main( void )
{
  printf( "y = 0\n" );
  return 0;
}

, и не беспокоиться о выделении места для y на всех.

У разных языков разные правила;если вам интересно, спросите об этом конкретном языке.

0 голосов
/ 12 декабря 2018

Далее предполагается, что код находится на C, а переменная не просто оптимизирована как существующая:

Поскольку это тег C, я предполагаю, что name имеет тип char *или указатель на char.Это означает, что сама переменная name всегда будет занимать либо 4 (32-разрядные системы), либо 8 байтов (64-разрядные системы), поскольку именно такой размер указателя обычно составляет.

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

При обоих вышеперечисленных случаях char * name = "Jhon"; фактически требует 13 байтов пространства - 8 байтов для указателя, 4 байта для каждого изсимволы и еще один байт для завершающего символа.Точно так же char * name = ""; требует 9 байтов пробела - 8 байтов для указателя и один байт для завершающего символа.

...