О "статическом" в C, как это реализовано компилятором? - PullRequest
5 голосов
/ 09 февраля 2011

О "статическом" в C, как это реализовано компилятором?

Это вопрос интервью Bloomberg. Есть мысли?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2011

[[Я предполагаю, что мы говорим о static в контексте переменных здесь, потому что static функции - просто вещь компиляции / компоновки, без последствий во время выполнения.]]

Короче говоря, это зависит от реализации.Компилятор может делать все, что захочет.

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

2 голосов
/ 10 февраля 2011

статические глобальные переменные обычно выделяют фиксированный адрес во время компиляции.Многие ОС предоставляют области памяти с инициализацией 0, другие отображают часть исполняемого образа с предварительно инициализированными данными, а также полностью неинициализированными областями.В зависимости от того, может ли компилятор обработать правильное начальное содержимое статической переменной во время компиляции, он может выбрать наиболее подходящую из этих областей памяти, вызывая любую инициализацию во время выполнения позже, если потребуется.Например:

static int x;  // needs to be 0 before main() runs
               // best way: 0-initialised memory area
static int y = 3; // best way: map/copy area of executable already containing "3"
static int z = time(NULL); // initial value unimportant
                           // best way: uninitialised memory area
                           //           pre-main() init code

Примечания: например, z помещается в 0-инициализированную память, а затем сжимается, что не приводит к значительным потерям - просто не является строго необходимым.Некоторые ОС могут иметь отдельные области для значений только для чтения / констант.

статические локальные переменные с известными начальными значениями во время компиляции может быть создано согласно глобальным переменным.Для инициализированных значений времени выполнения (допустимых только в C ++) компиляторы склонны (должны?) Инициализировать их при первом вводе области.Как правило, это координируется наличием неявного вспомогательного логического значения для каждой области, содержащего статические локальные переменные: каждый раз, когда вводится область, используется логическое значение, чтобы увидеть, нужно ли инициализировать статику.На некоторых компиляторах это на самом деле может быть сделано менее эффективным, но поточно-ориентированным способом, так что статические локальные переменные могут использоваться для одноэлементных экземпляров.инициализированный до main(), я написал некоторый код для изучения этого:

#include <stdio.h>
#include <time.h>

void f()
{
    static int i = time(NULL);
    printf("%d\n", i);
}

int main()
{
    int i = time(NULL);
    printf("%d\n", i);
    sleep(2);
    f();
}

С компилятором GCC C я получаю фатальную ошибку компиляции о локальном static i, требующем инициализации во время выполнения.Скомпилированный как C ++ (мой основной язык), он совершенно легален и инициализируется во время выполнения и после ввода main() - показывая, что эта часть моего объяснения выше относится только к C ++.

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

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