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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 74
Завершенные тесты: 2
#1

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

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

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

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

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

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

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

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

Объявление переменной внутри цикла while - C++
Доброго времени суток, форумчане. Расскажите нубу, что происходит при объявлении объявленной переменной. Знаю, звучит глупо, посему...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
09.07.2014, 17:54 #2
Цитата Сообщение от intern Посмотреть сообщение
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
память же выделяется под неё статически,а не динамически
0
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
09.07.2014, 17:58 #3
А почему он должен быть разный? Она же статическая.
0
Nick Alte
Эксперт С++
1638 / 1010 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
09.07.2014, 18:07 #4
Говоря точнее, переменная не статическая, а стековая. Память под такие переменные выделяется и освобождается предсказуемо, а главное - "бесплатно" по времени. Поэтому здесь и оптимизировать нечего. Так что с одной стороны одинаковые адреса - ожидаемое поведение и было бы весьма странно, если бы они менялись. С другой стороны, на такое поведение нет формальной гарантии и писать код, рассчитывающий на такую особенность, не лучшая затея, даже несмотря на то, что он будет работать.
0
intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 74
Завершенные тесты: 2
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;
}
0
Nick Alte
Эксперт С++
1638 / 1010 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
09.07.2014, 18:26 #6
Цитата Сообщение от intern Посмотреть сообщение
и при динамическом выделении адреса также одинаковые
А вот это уже вообще совсем не гарантированное поведение. Если в случае со стековыми переменными на проблемы можно нарваться разве что на какой-то экзотической архитектуре, то тут можно налететь на "неодинаковость" при самых разных обстоятельствах: сменив компилятор, использовав переопределение выделителей памяти, а то и просто переключившись из дебага в релиз.
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
09.07.2014, 18:26 #7
Цитата Сообщение от intern Посмотреть сообщение
Хорошо, но и в при динамическом выделении адреса также одинаковые
Убери delete и будут разные..
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
09.07.2014, 18:28 #8
Цитата Сообщение от intern Посмотреть сообщение
std::cout << &tmp << std::endl;
уверены?)
это адрес самого указателя
0
AlexVRud
442 / 152 / 38
Регистрация: 04.07.2014
Сообщений: 431
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;
};
0
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
09.07.2014, 19:30 #10
Странно, а почему вы считаете что адреса должны быть разные, если вы тут-же удаляете указатель.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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 расположена на стеке.
0
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,818
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
0
Jewbacabra
Эксперт PHP
2480 / 2068 / 783
Регистрация: 24.04.2014
Сообщений: 6,080
10.07.2014, 01:25 #13
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
5
//00684AB8
//00684B90
//00684BD0
//00684C10
//00684E48
разве это одинаковые?
0
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,818
10.07.2014, 02:19 #14
Цитата Сообщение от Jewbacabra Посмотреть сообщение
разве это одинаковые?
Разные, конечно Я и написал сообщение, чтобы показать, что при отсутствии delete, адреса переменных в динамической памяти будут разными.
0
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
10.07.2014, 08:51 #15
Одинаковый адрес это совпадение или нет?
Это коллапс волновой функции. Не совершайте акта наблюдения за адресом и компилятор скорее всего положит переменную в регистр (у которого адреса нет). Впрочем, он, наверно, все равно положит переменную в регистр, а память выделит чисто для галочки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 08:51
Привет! Вот еще темы с ответами:

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

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

Объявление третьей переменной в функции strtok_s - C++
Вот кусок кода: char **context; char *pch = strtok_s(str_text, &quot; ,.&quot;, &amp;context); //во втором параметре указаны разделители...

Объявление целочисленной переменной с именем var_i - C++
Требуется написать объявление целочисленной переменной с именем var_i


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2014, 08:51
Ответ Создать тему
Опции темы

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