Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Чем отличается static local variable от static global variable?

02.02.2019, 15:44. Показов 9993. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет

вроде уже ребята объясняли, но что -то я не понял....

скажите пожалуйста,чем отличается static local variable от static global variable?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2019, 15:44
Ответы с готовыми решениями:

О чем говорит ошибка "Non-static variable D cannot be referenced from a static context"
non-static variable D cannot be referenced from a static context Вот эта ошибка мне часто попадается. Подскажите что это означает? И...

Ошибка: non-static variable this cannot be referenced from a static context
Добрый вечер! Не пинайте сильно ногами, недавно решил взяться за обучение языку Java, что в мои годы уже подвиг сам по себе. Зубрю...

Non-static variable this cannot be referenced from a static context
Выводит следующие ошибки при компиляции данной программы import java.io.*; class HashTableApp { class DataItem { ...

37
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.02.2019, 15:53
Static внутри функции говорит о том, что переменная будет храниться в памяти до конца работы приложения
Static вне функции обеспечивает внутренне связывание, то есть к переменной не может обратиться код из других файлов проекта

Добавлено через 1 минуту
Помимо этого есть Static внутри класса: это означает один общий экземпляр переменной для всех экземпляров данного класса
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
02.07.2019, 19:33  [ТС]
Вы такие немногословные.... понадобилась столько много времени, чтобы понять что Вы имели ввиду.

а ведь можно было просто на примере показать, что

C++
1
2
3
4
5
6
void foo (void){
int a=0;
++a;
 
 
}
эта переменная умрет, как только отработает функция.

void foo1(void){
static int b=0;

++b;

}
а переменная 'b' будет жить и после того, как функция отработает.

если я сделаю
C++
1
2
3
4
5
6
7
8
9
10
std::cout <<foo();
std::cout << foo();
то в обоих случаях вывод будет единица, то есть 1.
 
если я сделаю 
std::cout  <<foo1();
std::cout << foo1()
то вывод будет 
1
2
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.07.2019, 20:02
pcmax, странный ты. Спросил про одно, показал про другое.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12927 / 6795 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
02.07.2019, 21:07
Цитата Сообщение от pcmax Посмотреть сообщение
а ведь можно было просто на примере показать, что
Где в вашем примере "static global variable"? Какое отношение ваш пример вообще имеет к заданному вами же вопросу про "отличия static local variable от static global variable"?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.07.2019, 22:35
pcmax, static local variable и static global variable это тёплое и мягкое. Путаница присутствует по историческим причинам, но их нельзя сравнивать как концепции принадлежащие общей категории static. В этом не корректность вашего вопроса. Кроме того, я могу в 2 счёта показать, что поиск даёт кучу развёрнутой инфы по обоим static'ам. Форум силён не тем, что кто-то перепишет вам чужую главу из книги или сайта. Тут можно получить конкретный ответ с нюансами которые, действительно, трудно найти. И... тут ни кто ни кому ни чего не должен. Хорошие манеры приветствуются.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.07.2019, 00:05
Цитата Сообщение от IGPIGP Посмотреть сообщение
это тёплое и мягкое
Как по мне как раз таки в одно направлении темы.

У меня кстати вопрос по этой теме:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void fn()
{
    static int i = 0;
    ++i;
}
 
int main()
{
    if (input() == 'k')
    {
        fn();
    }
}
Переменная i будет создана при открытие программы или при первом входе в функцию ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12927 / 6795 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
03.07.2019, 00:36
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Переменная i будет создана при открытие программы или при первом входе в функцию ?
Что такое "создана"?

Память под локальную статическую переменную выделяется при старте программы.

Статическая инициализация локальной статическую переменной делается "рано" - возможно при старте программы, возможно позже, но в любом случае раньше, чем динамическая инициализация этой переменной (если таковая нужна).

Динамическая инициализация локальной статическую переменной (если таковая нужна) делается при первом проходе процесса выполнения по объявлению этой переменной.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.07.2019, 00:44
del - завтра
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.07.2019, 01:30
TheCalligrapher,
подскажите пожалуйста примеры статической и динамической инициализации. Как я понял с ваших слов у меня в коде выделение памяти происходит при старте программы, но в то же время подходит под описания "динамической инициализации локальной статической переменной" как я понимаю. Ведь смысл такого скрытия статической переменной как раз в lazy initialization.

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <vector>
 
class A
{
public:
    std::vector<std::string>& GetData()
    {
        static std::vector<std::string> data;
        return data;
    }
};
 
int main()
{
    A a;
}
Я думаю ( или уже думал, пока еще не разобрался в смысле ваших слов ), что вектор в данном случаи не создается(память не выделяется), так как компилятор видит, что обращений к методу нету и выделять память нету смысла
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12927 / 6795 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
03.07.2019, 05:37
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
подскажите пожалуйста примеры статической и динамической инициализации.
Статическая инициализация - это
1) константная инициализация (инициализатор - константное выражение, а вызываемые конструкторы, если есть, то constexpr), и
2) предварительная инициализация нулями в случаях, когда инициализация не является константной.

Все остальное - динамическая инициализация.

Про статическую инициализацию часто говорят "инициализация, которая делается на стадии компиляции", а соответственно динамическая инициализация - это "инициализация, которая делается во время выполнения".

Например:

C++
1
2
3
4
5
6
7
8
9
void foo()
{
  static int a;      // Статическая инициализация
  static int b = 42; // Статическая инициализация
 
  static int c = rand(); 
  // Изначальное обнуление `c ` - cтатическая инициализация
  // Фактическая инициализация значением из `rand()` позже - динамическая инициализация
}
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как я понял с ваших слов у меня в коде выделение памяти происходит при старте программы, но в то же время подходит под описания "динамической инициализации локальной статической переменной" как я понимаю.
Нет, в вашем примере как раз статическая инициализация. Скалярный объект проинициализированный константным выражением 0 - очевидная константная инициализация, т.е. статическая инициализация.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Ведь смысл такого скрытия статической переменной как раз в lazy initialization.
Статическая инициализация, условно выражаясь, делается еще "на стадии компиляции" (как сказано выше). Она ничего не стоит во время выполнения, т.е. ее нет смысла делать lazy.

А вот инициализация вызовом rand(), как в моем примере выше, уже будет делаться как lazy.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <vector>
 
class A
{
public:
    std::vector<std::string>& GetData()
    {
        static std::vector<std::string> data;
        return data;
    }
};
 
int main()
{
    A a;
}
Я думаю ( или уже думал, пока еще не разобрался в смысле ваших слов ), что вектор в данном случаи не создается(память не выделяется), так как компилятор видит, что обращений к методу нету и выделять память нету смысла
О какой "памяти" идет речь? У std::vector много разных "памятей": память самого объекта std::vector, память элементов массива, хранящегося в этом объекте std::vector... О чем именно речь?

Память под сам объект data, разумеется всегда выделяется безусловно, сразу на старте программы. И для этого объекта data сразу делается статическая инициализация, т.е. обнуление.

А вот при первом вызове функции GetData будет выполнена динамическая инициализация data - вызов конструктора класса std::vector для объекта data и, возможно, выделение памяти для хранимых элементов вектора, вызовы конструкторов элементов и т.п. (если бы вы сразу указали ненулевой размер).
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 08:43  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кроме того, я могу в 2 счёта показать, что поиск даёт кучу развёрнутой инфы по обоим static'ам.
но каких ответов? благодаря таким ответам, мы до сих пор не можем разобраться.


ответы ответам -рознь.

вы же видите какую ересь я написал даже сейчас. это говорит о том, что я до сих пор не понимаю всех тонкостей. а почему? да потому что я получаю инфу из инете, а не от тех людей, которые получили знания из опыта.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
03.07.2019, 13:10
Цитата Сообщение от pcmax Посмотреть сообщение
чем отличается static local variable от static global variable?
static local variable - локальная.
static global variable - глобальная.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 15:23  [ТС]
static global variable - глобальная.[/quote]


несогласен.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.07.2019, 15:27
rikimaru2013, смысл одноразовости секса с инициализацией локальной статической переменной в том, что если вы написали такую инициализацию:
C++
1
2
3
4
5
int foo(int pleasure=0)
{
static int one_time_sex=123;
return sex+pleasure;
}
то инициализация 123 будет сделана однократно. Потом сколько не вызывай новым будет чистое удовольствие. Хотя в жизни так не бывает.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 15:32
Цитата Сообщение от pcmax Посмотреть сообщение
несогласен.
С чем ты не согласен? С тем что global - глобальная?
C++
1
2
3
4
5
//file.cpp
int v; //static global variable
void foo() {
   static int x;//static local variable
}
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 15:54  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
С тем что global - глобальная?
с тем что static global будет глобальной переменной.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.07.2019, 15:57
pcmax,
А почему тогда оно называется global, если эта переменная не глобальная?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 16:20
Цитата Сообщение от pcmax Посмотреть сообщение
с тем что static global будет глобальной переменной.
А что ты подразумеваешь под static global variable?
Хоть покажи. Если ты к глобальной переменная допишешь static, то она всё равно будет глобальной, и тогда нужно рассматривать тему внутренней и внешней линковки, а не статическое время хранения и область видимости.
т.е.
C++
1
2
3
//На уровне файла:
int v1;//Статическая глобальная переменная с внешней линковкой
static int v1;//Статическая глобальная переменная с внутренней линковкой
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 16:29  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
А что ты подразумеваешь под static global variable?

извините, но это не комне вопрос... я и создал эту тему чтобы разобраться.

но на мой взгляд static global -это бред. global виндна из всех файлов состовляющих программу, а static переменная винда лишь из того файла, где она создана. значит static ограничит global и тогда глобальная переменная уже не будет глобальной
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.07.2019, 16:29
Помогаю со студенческими работами здесь

Non-static variable a cannot be referenced from a static context
non-static variable a cannot be referenced from a static context public class MyClass { private int a=2; private boolean...

non-static variable cannot be referenced from a static context
Здравствуйте, Пытаюсь создать запись в таблице MySQL c JFrame. Выдает ошибку non-static variable cannot be referenced from a static...

Не могу понять в чем дело,выдает ошибку [Warning] Unit1.pas(90): For loop control variable must be simple local variable
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

Исправить ошибку For loop control variable must be simple local variable
var q,s,n:integer; a:array of integer; i:integer; Form1: TForm1; implementation {$R *.dfm} procedure...

[Warning] Unit1.pas(132): For loop control variable must be simple local variable
Помогите пожалуйста! что я не так делаю? ошибки: Unit1.pas(174): For loop control variable must be simple local variable ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru