Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
 Аватар для intern
15 / 15 / 8
Регистрация: 30.03.2014
Сообщений: 75

Объявление переменной в цикле

09.07.2014, 17:52. Показов 4091. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
for (int i=0; i!=5; ++i)
{
    int tmp;
    std::cout << &tmp << std::endl;
}
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
Миниатюры
Объявление переменной в цикле  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2014, 17:52
Ответы с готовыми решениями:

Объявление переменной в цикле - зло?
Во имя читаемости пришлось объявить и инициализировать ссылки на переменные и сами переменные в теле цикла. Преподаватель против такой...

Объявление переменной
Доброго времени суток. Возник вопрос, по какой причине при следующей форме записи, переменные &quot;y&quot; и &quot;z&quot; считаются...

Объявление переменной
Здравствуйте! В программе есть две формы. Как объявить переменную чтобы она была доступна в обеих формах? Или как переменную из одной...

18
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
09.07.2014, 17:54
Цитата Сообщение от intern Посмотреть сообщение
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
память же выделяется под неё статически,а не динамически
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
09.07.2014, 17:58
А почему он должен быть разный? Она же статическая.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.07.2014, 18:07
Говоря точнее, переменная не статическая, а стековая. Память под такие переменные выделяется и освобождается предсказуемо, а главное - "бесплатно" по времени. Поэтому здесь и оптимизировать нечего. Так что с одной стороны одинаковые адреса - ожидаемое поведение и было бы весьма странно, если бы они менялись. С другой стороны, на такое поведение нет формальной гарантии и писать код, рассчитывающий на такую особенность, не лучшая затея, даже несмотря на то, что он будет работать.
0
 Аватар для intern
15 / 15 / 8
Регистрация: 30.03.2014
Сообщений: 75
09.07.2014, 18:21  [ТС]
Хорошо, но и в при динамическом выделении адреса также одинаковые
C++
1
2
3
4
5
6
for (int i=0; i!=5; ++i)
{
    int *tmp = new int;
    std::cout << &tmp << std::endl;
    delete tmp;
}
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.07.2014, 18:26
Цитата Сообщение от intern Посмотреть сообщение
и при динамическом выделении адреса также одинаковые
А вот это уже вообще совсем не гарантированное поведение. Если в случае со стековыми переменными на проблемы можно нарваться разве что на какой-то экзотической архитектуре, то тут можно налететь на "неодинаковость" при самых разных обстоятельствах: сменив компилятор, использовав переопределение выделителей памяти, а то и просто переключившись из дебага в релиз.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
09.07.2014, 18:26
Цитата Сообщение от intern Посмотреть сообщение
Хорошо, но и в при динамическом выделении адреса также одинаковые
Убери delete и будут разные..
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
09.07.2014, 18:28
Цитата Сообщение от intern Посмотреть сообщение
std::cout << &tmp << std::endl;
уверены?)
это адрес самого указателя
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
09.07.2014, 19:15
Возьми класс в качестве внутренней переменной и посмотри что происходит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class My {
public:
  My(int i=0) : i_(i) {
    std::cout << "Create  ptr=" << this << " i=" << i_ << std::endl;
  };
  ~My() {
    std::cout << "Destroy ptr=" << this << std::endl;
  };
  int i_;
};
 
int main() {
  for(int i=0; i<10; i++) {
    My m;
  };
  return 0;
};
0
 Аватар для Bend3r
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
09.07.2014, 19:30
Странно, а почему вы считаете что адреса должны быть разные, если вы тут-же удаляете указатель.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.07.2014, 23:37
как уже заметил dzrkot, разницы в том, сколько бы new и delete'ов не было, выводится-то адрес стековой переменной, а не динамической. Несмотря на то, что память под int выделяется из кучи, память, в которой расположен сам указатель находится на стеке. Т.о. запись:
C++
1
2
int tmp;
cout << &tmp;
концептуально ничем не отличается от записи:
C++
1
2
int* tmp;
cout << &tmp;
Просто в первом случае T=int, а во втором T=int*. Но в обоих случаях - переменная типа T расположена на стеке.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
10.07.2014, 00:55
Цитата Сообщение от ISergey Посмотреть сообщение
Убери delete и будут разные..
Цитата Сообщение от intern Посмотреть сообщение
Хорошо, но и в при динамическом выделении адреса также одинаковые
C++
1
2
3
4
5
6
7
8
9
10
11
for (int i=0; i!=5; ++i)
{
    int *tmp = new int;
    std::cout << tmp << std::endl;
    //delete tmp;
}
//00684AB8
//00684B90
//00684BD0
//00684C10
//00684E48
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
10.07.2014, 01:25
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
5
//00684AB8
//00684B90
//00684BD0
//00684C10
//00684E48
разве это одинаковые?
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
10.07.2014, 02:19
Цитата Сообщение от Jewbacabra Посмотреть сообщение
разве это одинаковые?
Разные, конечно Я и написал сообщение, чтобы показать, что при отсутствии delete, адреса переменных в динамической памяти будут разными.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.07.2014, 08:51
Одинаковый адрес это совпадение или нет?
Это коллапс волновой функции. Не совершайте акта наблюдения за адресом и компилятор скорее всего положит переменную в регистр (у которого адреса нет). Впрочем, он, наверно, все равно положит переменную в регистр, а память выделит чисто для галочки.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
10.07.2014, 09:03
вообще вроде при выделении динамической памяти резервируется блок памяти, запись в который ведётся с определённого байта (аналогия - 0 элемент массива), соответственно мы создали элемент - записали его в условно a[0], удалили элемент - а[0] освободилось, создали новый - записали снова в этот же уже ранее зарезервированный блок, но к примеру вот:
создали tmp tmp2 потом tmp3
в зависимости от порядка delete tmp3 будет создаваться в разных ячейках памяти
C++
1
2
3
4
5
6
7
8
9
int *tmp = new int;
    std::cout << tmp << std::endl;
    int *tmp2 = new int;
    std::cout << tmp2 << std::endl;
    delete tmp;         // если поменять местами то
    delete tmp2;        // адрес temp3 изменится
    int *tmp3 = new int;
    std::cout << tmp3 << std::endl;
    delete tmp3;
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.07.2014, 10:43
Цитата Сообщение от dzrkot Посмотреть сообщение
в зависимости от порядка delete tmp3 будет создаваться в разных ячейках памяти
Это всё зависит от реализации.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
10.07.2014, 10:46
Цитата Сообщение от Tulosba Посмотреть сообщение
Это всё зависит от реализации.
мб, для меня уже не играет роли в какой ячейке памяти что будет храниться, смысла в таких знаниях не вижу))
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.07.2014, 10:50
Цитата Сообщение от dzrkot Посмотреть сообщение
, смысла в таких знаниях не вижу))
О чем и речь, полагаться на то, что так работает какой-то конкретный компилятор не стоит. Потому что его логика уже может измениться как с выходом новых версий, так и при каких-либо ключах компиляции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2014, 10:50
Помогаю со студенческими работами здесь

Объявление переменной
Два вопроса: 1) Чем отличается запись: int a = 10; От: int a(10); 2) Что обозначает данная запись: int *a = new int (3); ...

Условное объявление переменной
Добрый день. Возникла необходимость объявления одного из полей в зависимости от параметров шаблона класса. Нет ли в C++ возможности...

Объявление переменной своего типа
Есть код #include &lt;iostream&gt; #include &lt;iomanip&gt; //#include &quot;complexz&quot; using namespace std; int main(){ double a,b,c,d; ...

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

Объявление переменной вне case
Не могу понять что-то не так case R: { .... if ()


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru