Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
intern
 Аватар для intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 67
Завершенные тесты: 1
09.07.2014, 17:52     Объявление переменной в цикле #1
C++
1
2
3
4
5
for (int i=0; i!=5; ++i)
{
    int tmp;
    std::cout << &tmp << std::endl;
}
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
Миниатюры
Объявление переменной в цикле  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2014, 17:52     Объявление переменной в цикле
Посмотрите здесь:

Объявление переменной C++
C++ Объявление переменной
Объявление переменной вне case C++
Объявление переменной, после ввода её имени с клавиатуры C++
Объявление переменной C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
09.07.2014, 17:54     Объявление переменной в цикле #2
Цитата Сообщение от intern Посмотреть сообщение
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
память же выделяется под неё статически,а не динамически
nmcf
4306 / 3727 / 1256
Регистрация: 14.04.2014
Сообщений: 14,599
09.07.2014, 17:58     Объявление переменной в цикле #3
А почему он должен быть разный? Она же статическая.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
09.07.2014, 18:07     Объявление переменной в цикле #4
Говоря точнее, переменная не статическая, а стековая. Память под такие переменные выделяется и освобождается предсказуемо, а главное - "бесплатно" по времени. Поэтому здесь и оптимизировать нечего. Так что с одной стороны одинаковые адреса - ожидаемое поведение и было бы весьма странно, если бы они менялись. С другой стороны, на такое поведение нет формальной гарантии и писать код, рассчитывающий на такую особенность, не лучшая затея, даже несмотря на то, что он будет работать.
intern
 Аватар для intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 67
Завершенные тесты: 1
09.07.2014, 18:21  [ТС]     Объявление переменной в цикле #5
Хорошо, но и в при динамическом выделении адреса также одинаковые
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;
}
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
09.07.2014, 18:26     Объявление переменной в цикле #6
Цитата Сообщение от intern Посмотреть сообщение
и при динамическом выделении адреса также одинаковые
А вот это уже вообще совсем не гарантированное поведение. Если в случае со стековыми переменными на проблемы можно нарваться разве что на какой-то экзотической архитектуре, то тут можно налететь на "неодинаковость" при самых разных обстоятельствах: сменив компилятор, использовав переопределение выделителей памяти, а то и просто переключившись из дебага в релиз.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
09.07.2014, 18:26     Объявление переменной в цикле #7
Цитата Сообщение от intern Посмотреть сообщение
Хорошо, но и в при динамическом выделении адреса также одинаковые
Убери delete и будут разные..
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
09.07.2014, 18:28     Объявление переменной в цикле #8
Цитата Сообщение от intern Посмотреть сообщение
std::cout << &tmp << std::endl;
уверены?)
это адрес самого указателя
AlexVRud
414 / 143 / 36
Регистрация: 04.07.2014
Сообщений: 415
09.07.2014, 19:15     Объявление переменной в цикле #9
Возьми класс в качестве внутренней переменной и посмотри что происходит:
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;
};
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
09.07.2014, 19:30     Объявление переменной в цикле #10
Странно, а почему вы считаете что адреса должны быть разные, если вы тут-же удаляете указатель.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.07.2014, 23:37     Объявление переменной в цикле #11
как уже заметил dzrkot, разницы в том, сколько бы new и delete'ов не было, выводится-то адрес стековой переменной, а не динамической. Несмотря на то, что память под int выделяется из кучи, память, в которой расположен сам указатель находится на стеке. Т.о. запись:
C++
1
2
int tmp;
cout << &tmp;
концептуально ничем не отличается от записи:
C++
1
2
int* tmp;
cout << &tmp;
Просто в первом случае T=int, а во втором T=int*. Но в обоих случаях - переменная типа T расположена на стеке.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
10.07.2014, 00:55     Объявление переменной в цикле #12
Цитата Сообщение от 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
Jewbacabra
1791 / 1506 / 540
Регистрация: 24.04.2014
Сообщений: 4,238
10.07.2014, 01:25     Объявление переменной в цикле #13
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
5
//00684AB8
//00684B90
//00684BD0
//00684C10
//00684E48
разве это одинаковые?
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
10.07.2014, 02:19     Объявление переменной в цикле #14
Цитата Сообщение от Jewbacabra Посмотреть сообщение
разве это одинаковые?
Разные, конечно Я и написал сообщение, чтобы показать, что при отсутствии delete, адреса переменных в динамической памяти будут разными.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
10.07.2014, 08:51     Объявление переменной в цикле #15
Одинаковый адрес это совпадение или нет?
Это коллапс волновой функции. Не совершайте акта наблюдения за адресом и компилятор скорее всего положит переменную в регистр (у которого адреса нет). Впрочем, он, наверно, все равно положит переменную в регистр, а память выделит чисто для галочки.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
10.07.2014, 09:03     Объявление переменной в цикле #16
вообще вроде при выделении динамической памяти резервируется блок памяти, запись в который ведётся с определённого байта (аналогия - 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;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 10:43     Объявление переменной в цикле #17
Цитата Сообщение от dzrkot Посмотреть сообщение
в зависимости от порядка delete tmp3 будет создаваться в разных ячейках памяти
Это всё зависит от реализации.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
10.07.2014, 10:46     Объявление переменной в цикле #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Это всё зависит от реализации.
мб, для меня уже не играет роли в какой ячейке памяти что будет храниться, смысла в таких знаниях не вижу))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 10:50     Объявление переменной в цикле
Еще ссылки по теме:

Объявление переменной своего типа C++
C++ Объявление целочисленной переменной с именем var_i
Объявление переменной внутри цикла while C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 10:50     Объявление переменной в цикле #19
Цитата Сообщение от dzrkot Посмотреть сообщение
, смысла в таких знаниях не вижу))
О чем и речь, полагаться на то, что так работает какой-то конкретный компилятор не стоит. Потому что его логика уже может измениться как с выходом новых версий, так и при каких-либо ключах компиляции.
Yandex
Объявления
10.07.2014, 10:50     Объявление переменной в цикле
Ответ Создать тему
Опции темы

Текущее время: 09:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru