C ++: объявления статических переменных в функции - PullRequest
1 голос
/ 04 марта 2011

Статические переменные существуют вне функции, по крайней мере, с точки зрения их памяти (не объема), верно?Но меня всегда беспокоило то, что происходит, когда я вызываю функцию во второй раз.Например:

f(){
    static char buffer[256*256];
    stuff(buffer);
}

Когда я вызываю эту функцию во второй раз, технически она не объявляет переменную 'buffer' второй раз?Или он работает по-разному со статическими переменными (в отличие от обычных) после того, как все скомпилировано?

... Иногда мне хотелось бы, чтобы был график или что-то вроде того, во что компилятор c ++ обычно превращает код (без оптимизации), чтобы мне не пришлось беспокоить вас, ребята, с такими маленькими вопросами, как этот, ага.Заранее спасибо!

edit: я знаю, что это работает так, я просто хочу знать почему, хотя.Это, наверное, что-то ошеломительно простое ...

Ответы [ 5 ]

3 голосов
/ 04 марта 2011

Статические объекты длительности хранения в области действия функции.

Эти объекты создаются при первом использовании.
Затем уничтожается в обратном порядке создания (с другими статическими объектами длительности хранения).

#include <iostream>

class X
{
    public:
        X(int x): m(x)      {std::cout << "X: " << m << " created\n"; }
        ~X()                {std::cout << "X: " << m << " destroyed\n";}

    private:
        int m;
};


static X    x1(1);

int test()
{
    std::cout << "Test: Start\n";
    static  X x3(3);

    std::cout << "Test: Finished\n";
    return 5;
}


int main()
{
    std::cout << "Main: Start\n";
    X   x2(2);

    test();

    X   x4(4);
    std::cout << "Main: Finished\n";
}

Теперь попробуйте: (комментарии добавлены). SSDO => Статическая длительность хранения объекта.

g++ X.cpp
./a.out
X: 1 created    // SSDO file scope.
Main: Start
X: 2 created
Test: Start
X: 3 created    // SSDO created on first use (Notice not destroyed)
Test: Finished
Test: Start     // Notice not created here.
Test: Finished
X: 4 created
Main: Finished
X: 4 destroyed
X: 2 destroyed  // Main now really finished. after destroying local variables.
X: 3 destroyed  // Destroy SSDO in reverse order of creation. (3 - 1)
X: 1 destroyed
3 голосов
/ 04 марта 2011

Нет, вы static означает, что это выходит за рамки вашей функции.Он имеет тот же эффект, что и запись:

static char buffer[256*256];

f(){
    stuff(buffer);
}

За исключением того, что буфер виден только в области действия вашей функции, а код более читабелен.

(ПРИМЕЧАНИЕ. Мой пример нене применяется, когда тип char не является примитивным типом - в этом случае он создается в первый раз, когда он "объявлен").

1 голос
/ 04 марта 2011

В этом контексте static означает, что переменная имеет время жизни приложения.Он присваивается до main(), когда функция вводится, и освобождается после возврата main().Кроме того, его значение сохраняется между вызовами функций.Думайте об этом как о глобальной переменной, которая видна только внутри этой функции.

0 голосов
/ 04 марта 2011

Этот пример может проиллюстрировать это:

#include <iostream>
using namespace std;

void test() {
  static int i = 123;
  if (i == 123) {
    i = 321;
  }
  cout << i << endl;
}

int main(int arg, char **argv) {
  test();
  test();
  return 0;
}

Вывод:

321

321

Таким образом, «i» инициализируется тольковпервые встречается, так сказать.Но на самом деле он выделяется во время компиляции для этой функции.После этого он входит в область действия функции test () как переменная, но он является статическим, поэтому его изменение также изменяет его во всех будущих вызовах test ().

0 голосов
/ 04 марта 2011

Переменная существует до и после вызова функции ... она статическая.

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