Что значит & ldquo; static & rdquo; значит в С?

Я столкнулся с рядом ограничений, связанных с подготовленным оператором:

  1. Подготовленные операторы кэшируются только внутри одного сеанса (Postgres), поэтому он действительно будет работать только с пулом соединений
  2. Множество разных подготовленных операторов, предложенных @BalusC, может привести к переполнению кеша, а ранее кэшированные операторы будут удалены
  3. Запрос должен быть оптимизирован и использовать индексы. Звучит очевидно, однако, например, заявление ANY (ARRAY ...), предложенное @Boris в одном из лучших ответов, не может использовать индексы, и запрос будет медленным, несмотря на кеширование
  4. . Подготовленный оператор также кэширует план запроса, а фактические значения любые параметры, указанные в инструкции, недоступны.

Среди предлагаемых решений я бы выбрал тот, который не уменьшает производительность запроса и уменьшает количество запросов. Это будет # 4 (партия нескольких запросов) из ссылки @Don или указание значений NULL для ненужных '?' знаки, предложенные В.Дужевым

1003
задан jww 29 October 2017 в 15:42
поделиться

8 ответов

  1. статическая переменная А в функции сохраняет свое значение между вызовами.
  2. А статическая глобальная переменная или функция "замечены" только в файле, которым это объявляется в

(1), более внешняя тема, если Вы - новичок, таким образом, вот пример:

#include <stdio.h>

void foo()
{
    int a = 10;
    static int sa = 10;

    a += 5;
    sa += 5;

    printf("a = %d, sa = %d\n", a, sa);
}


int main()
{
    int i;

    for (i = 0; i < 10; ++i)
        foo();
}

Это печатает:

a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60

Это полезно для случаев, где функция должна сохранить некоторое состояние между вызовами, и Вы не хотите использовать глобальные переменные. Остерегайтесь, однако, эта функция должна быть использована очень экономно - она делает Ваш код не ориентированным на многопотоковое исполнение и более твердым понять.

(2) используется широко в качестве функции "управления доступом". Если у Вас есть.c файл, реализовывая некоторую функциональность, это обычно выставляет только несколько "общедоступных" функций пользователям. Остальная часть его функций должна быть сделана static, так, чтобы пользователь не мог получить доступ к ним. Это - инкапсуляция, хорошая практика.

Заключение в кавычки Википедия :

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

См. здесь и здесь для получения дополнительной информации.

И отвечать на Ваш второй вопрос, это не похоже в C#.

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

1383
ответ дан user1043148 30 October 2017 в 01:42
поделиться
  • 1
    проблема остается, и появитесь другой incongruency. в Toc, попытки раздела имеют номер 3, в теле имеет номер 4. – mjsr 7 May 2010 в 15:11

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

, Если Вы объявляете статичную глобальную переменную, ее объем будет ограничен в файле, в котором Вы объявили это. Это немного более безопасно, чем постоянный клиент, глобальный, который может быть считан и изменен всюду по Вашей всей программе.

7
ответ дан Sam Hoice 30 October 2017 в 01:42
поделиться
  • 1
    Вы могли обеспечить пример, как я мог сохранить свою собственную переменную сеанса в другом месте? Также к переменным сеанса можно все еще получить доступ таким же образом? – Neville Nazerane 18 March 2014 в 05:36

Это зависит:

int foo()
{
   static int x;
   return ++x;
}

функция возвратилась бы 1, 2, 3, и т.д.---переменная не находится на стеке.

a.c:

static int foo()
{
}

Это означает, что эта функция имеет объем только в этом файле. Таким образом, a.c и b.c может иметь отличающийся foo() с, и нечто не подвергнуто общим объектам. Таким образом, при определении нечто в a.c, Вы не могли бы получить доступ к нему от b.c или ни от каких других мест.

В большинстве библиотек C все "частные" функции статичны, и большая часть "общественности" не.

37
ответ дан Peter Mortensen 30 October 2017 в 01:42
поделиться
  • 1
    @hobbs: Ну, другое различие - то, что defined(undef) ложь, но defined(1==2) верно. – cjm 31 January 2010 в 10:52

static разные вещи средств в различных контекстах.

  1. можно объявить статическую переменную в функции C. Эта переменная только видима в функции однако, она ведет себя как глобальное в этом, она только инициализируется однажды, и она сохраняет свое значение. В этом примере каждый раз Вы звоните foo(), он распечатает растущее число. Статическая переменная инициализируется только однажды.

    void foo ()
    {
    static int i = 0;
    printf("%d", i); i++
    }
    
  2. Другое использование помех состоит в том, когда Вы реализуете функциональную или глобальную переменную в.c файле, но не хотите, чтобы его символ был видим за пределами эти .obj сгенерированный файлом. например,

    static void foo() { ... }
    
14
ответ дан Jason Plank 30 October 2017 в 01:42
поделиться

В C, статичном, имеет два значения, в зависимости от объема его использования. В глобальной области видимости, когда объект объявляется на уровне файла, это означает, что тот объект только видим в том файле.

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

void procedure(void)
{
   static int i = 0;

   i++;
}

значение 'я' инициализируюсь для обнуления на первом вызове к процедуре, и значение сохраняется в каждый последующий раз, когда процедуру называют. если бы 'я' был распечатан, то это произвело бы последовательность 0, 1, 2, 3...

6
ответ дан schot 30 October 2017 в 01:42
поделиться
  • 1
    It' s также общая идиома на других языках также как JavaScript. – mpeters 30 January 2010 в 16:40

Короткий ответ... это зависит.

  1. Статические определенные локальные переменные не теряют свое значение между вызовами функции. Другими словами, они - глобальные переменные, но ограниченный по объему к локальной функции они определяются в.

  2. Статические глобальные переменные не видимы за пределами файла C, в котором они определяются.

  3. Статические функции не видимы за пределами файла C, в котором они определяются.

156
ответ дан Samuel Edwin Ward 30 October 2017 в 01:42
поделиться
  • 1
    +1 Вы, очевидно, имели влияние на другие ответы. Brad изменил свой ответ после Вашего. Кроме того, по крайней мере один из тех, которых Вы упомянули, закончил тем, что удалил его ответ также. – Christopher Bottoms 12 April 2010 в 16:40

Из Википедии:

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

15
ответ дан OscarRyz 30 October 2017 в 01:42
поделиться
  • 1
    Это не корректно. Когда оператор должен сгенерировать ложное значение, он использует волшебное значение, которое оценивает как пустая строка в строковом контексте или 0 в числовом контексте. (Исключениями являются операторы как and и or, которые просто возвращают операнд, который заставил их возвращать false.) (См. perldoc.perl.org/perlsyn.html#Truth-and-Falsehood ), – cjm 31 January 2010 в 07:17

Если Вы объявляете это в mytest.c файл:

static int my_variable;

Тогда эта переменная может только быть замечена из этого файла. Переменная не может быть экспортирована больше никуда.

, Если Вы объявляете в функции, значение переменной сохранит свое значение каждым разом, когда функция вызвана.

А статическая функция не может быть экспортирована снаружи файла. Таким образом в *.c файл, Вы скрываете функции и переменные, если Вы объявляете их статичный.

5
ответ дан Felipe Augusto 30 October 2017 в 01:42
поделиться
  • 1
    Это производит 1 или каноническое ложное значение, не 0. Это 0 в числовом контексте, но пустой строке в строковом контексте. Для получения 0 или 1 используйте 1-! оператор:) – ysth 31 January 2010 в 07:27
Другие вопросы по тегам:

Похожие вопросы: