Сколько памяти используется в следующей программе на C? - PullRequest
0 голосов
/ 17 ноября 2018

Предположим, что размер int составляет 4 байта.После фрагмента кода в C, сколько байт требуется для хранения переменных?* Я прочитал, что некоторые из них могут быть сохранены в регистрах / стеке, но я спросил об общем размере, поэтому это не имеет значения.

{
    int a,b;
    {
        int c; 
    }
    {
        int d, e;
    }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Вам все равно, и это зависит много от флагов оптимизации и компилятора .

Переменная может оставаться целиком в регистре процессора , и тогда она не потребляет память (и иногда она не появляется в сгенерированном машинном коде, потому что компилятор вычислил что это бесполезно). Но читайте о стеке вызовов и кадрах вызовов и распределении регистров . Конечно, правило здравого смысла состоит в том, чтобы избегать огромных кадров вызовов (например, избегать объявления очень больших автоматических переменных , таких как double hugelocalarr[1000000];). Разумный кадр вызова должен (в общем случае) составлять не более килобайта или нескольких из них (часто общий стек вызовов не должен превышать мегабайт или несколько из них, и вам необходимо подумать о рекурсивных функциях или глубоко вложенных вызовах) .

На практике, если вы компилируете с GCC , посмотрите на опции команды , такие как -Wstack-usage= X (используйте ее с различными флагами оптимизации, такими как -O1 или -O2 ...) и т. Д. ... Вы получите предупреждения о функциях, использующих большой стек (больше, чем X байт).

Знайте также о оконечных вызовах . Последние компиляторы иногда могут их умно оптимизировать. И подумайте также о встроенном расширении . Компиляторы могут сделать это при оптимизации (даже без любое ключевое слово inline).

Прочитайте C не является языком низкого уровня статья Дэвида Чисналла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...