Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
lenchis001
1 / 1 / 6
Регистрация: 28.08.2014
Сообщений: 93
#1

Определить время жизни Static переменной - C++

12.09.2014, 04:34. Просмотров 1076. Ответов 29
Метки нет (Все метки)

Привет народ. Вопрос: Если static переменная объявлена в теге(внутри функции), она будет жить пока не закроется тег или всю функцию и после неё? Спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2014, 04:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Определить время жизни Static переменной (C++):

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

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

Время жизни объектов
Вроде простая вещь, а не могу понять почему так. #include <iostream> using...

C++11 время жизни переменных
После долгого перерыва в программирование вновь спохватился и тут наткнулся на...

Инициализация static переменной
Задание опять же таки из книги Страуструпа: Определите два класса, каждый со...

Время жизни лямбда-функции
A lambda might outlive its caller/ This can happen if we pass a lambda to a...

29
maxillion
273 / 183 / 52
Регистрация: 25.12.2012
Сообщений: 616
12.09.2014, 21:53 #21
Ну хорошо скажу тебе так.
Функция при вызове выделяет себе определенный размер стековой памяти уменьшая значения ESP эта дешевая операция. Предположим что твоя переменная которая закончила свою жизнь находится между переменных которые ещё существуют. Ты представляешь сколько нужно выполнить операций для её удаления.
Теперь вопрос:
Стоит ли за ради экономии 4 Байт выполнять кучу не нужных операция ?
0
lenchis001
1 / 1 / 6
Регистрация: 28.08.2014
Сообщений: 93
12.09.2014, 21:58  [ТС] #22
Если Вы мне задаёте этот вопрос, значит просто меня не знаете..)
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
12.09.2014, 22:01 #23
Цитата Сообщение от lenchis001 Посмотреть сообщение
при выводе получился мусор.
Судя по коду не мусор, а адрес.

Цитата Сообщение от lenchis001 Посмотреть сообщение
а вдруг компилятор специально не удаляет переменную "y" именно потому, что я решил обращаться к ней при помощи указателя..?
при выводе значения через указатель после выравнивания
Гадаешь на кофейной гуще. Смотри ассемблер, если не уверен.

Цитата Сообщение от lenchis001 Посмотреть сообщение
я вручную выровнял адреса указателя
В чем смысл этого "выравнивания"? И логика в выводах из него тоже не прослеживается.
В общем не знаю что ты там выравнивал, но если хотел вывести 4, то вообще-то стек на x86 растет вниз и нужен вот такой код UB:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main()
{
    int *u;
    {
        int y = 7;
        u = &y;
    }
    {
        int x = 4;
        cout << &x << endl;
    }
    u--;
    cout << *u << endl;
0
lenchis001
1 / 1 / 6
Регистрация: 28.08.2014
Сообщений: 93
12.09.2014, 22:03  [ТС] #24
Скомпилируй, и увидишь, что адреса сходится будут.
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
12.09.2014, 22:04 #25
lenchis001, http://habrahabr.ru/post/128991/
0
lenchis001
1 / 1 / 6
Регистрация: 28.08.2014
Сообщений: 93
12.09.2014, 22:07  [ТС] #26
нам это на системном программировании каждый день..
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
12.09.2014, 22:09 #27
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Цитата Сообщение от lenchis001 Посмотреть сообщение
Скомпилируй, и увидишь, что адреса сходится будут.
Пожалуйста.

Добавлено через 2 минуты
Цитата Сообщение от lenchis001 Посмотреть сообщение
нам это на системном программировании каждый день..
Тогда ассемблер смотри и не гадай
10 раз уже сказали, что все эти махинации - это UB. Хочешь знать что происходит в конкретном варианте? Смотри дизасм, меняй программу, снова смотри дизасм и т.д.. Только будь готов, что на другом компиляторе может быть совсем по-другому.
0
lenchis001
1 / 1 / 6
Регистрация: 28.08.2014
Сообщений: 93
12.09.2014, 22:19  [ТС] #28
у меня сходятся. дополнить нечего.

Определить время жизни Static переменной

Добавлено через 9 минут
поменял, и то что я говорю подтверждается: он специально не удаляет переменные, на которые сделан указатель.

Определить время жизни Static переменной

но вот как от этой сохранённой переменной потом избавится наконец - вопрос открытый..
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.09.2014, 22:31 #29
Цитата Сообщение от lenchis001 Посмотреть сообщение
но вот как от этой сохранённой переменной потом избавится наконец - вопрос открытый..
Да легко !
__declspec(naked), далее пишешь свой пролог и эпилог для каждой функции и
на выходе ручками затираешь все стековые переменные в ноль. Лепота !

Добавлено через 1 минуту
Цитата Сообщение от maxillion Посмотреть сообщение
Стоит ли за ради экономии 4 Байт выполнять кучу не нужных операция ?
Там нет экономии. Вместо 4 байт мусора получим 4 байта другого мусора.

Добавлено через 22 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
10 раз уже сказали, что все эти махинации - это UB.
+10500 * 10^67 !
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.09.2014, 18:53 #30
Как и обещал. (пишу по памяти, с телефона, сидя в лесу под деревом, поэтому могу допустить незначительные ошибки)
Используя компилятор GCC 4.8.2 в составе MinGW я узнал следующее.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    int * u;
    int * v;
    {
        int y[] = { 1,1,1,1,1,1,1,1 };
        u = &y[0];
    }
    {
        int y[] = { 8,8,8,8,8,8,8,8 };
        v = &y[0];
    }
    std::cout << *u << std::endl;
    std::cout << *v << std::endl;
У меня выводит две восьмёрки.
Если же уменьшить размер массивов на еденицу, то на выходе будет 1 и 8.
Компилятор, по не понятной мне причине, увеличивает срок жизни (lifetime) стековых переменных если стековой памяти достаточно, хотя стандарт этого не требует. Да и не за чем..

Добавлено через 11 минут
А от сохранённой переменной (которая по стандарту временная) избавлятся не недо. Это забота компилятора.
0
13.09.2014, 18:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2014, 18:53
Привет! Вот еще темы с решениями:

Время жизни объекта класса
Всем привет! Вот возник у меня вопросс с ООП и разработкой больших программ. ...

Время жизни временного объекта
можно ли передать временный объект в функцию по ссылке? void f1(int &amp; ); ...

Объявление static переменной в классе
class Worker { private : struct WorkerItem { UnicodeString fio;...

Время жизни локальных переменных в цикле
Добрый вечер! допустим, в таком коде: int i=100; while(i&gt;0) { int t =...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru