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

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

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

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

09.07.2014, 17:52. Просмотров 847. Ответов 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++
Доброго времени суток, форумчане. Расскажите нубу, что происходит при объявлении объявленной переменной. Знаю, звучит глупо, посему...

18
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
09.07.2014, 17:54 #2
Цитата Сообщение от intern Посмотреть сообщение
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
память же выделяется под неё статически,а не динамически
0
nmcf
5354 / 4674 / 1565
Регистрация: 14.04.2014
Сообщений: 18,632
09.07.2014, 17:58 #3
А почему он должен быть разный? Она же статическая.
0
Nick Alte
Эксперт С++
1639 / 1011 / 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
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
09.07.2014, 18:26 #6
Цитата Сообщение от intern Посмотреть сообщение
и при динамическом выделении адреса также одинаковые
А вот это уже вообще совсем не гарантированное поведение. Если в случае со стековыми переменными на проблемы можно нарваться разве что на какой-то экзотической архитектуре, то тут можно налететь на "неодинаковость" при самых разных обстоятельствах: сменив компилятор, использовав переопределение выделителей памяти, а то и просто переключившись из дебага в релиз.
0
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
09.07.2014, 18:26 #7
Цитата Сообщение от intern Посмотреть сообщение
Хорошо, но и в при динамическом выделении адреса также одинаковые
Убери delete и будут разные..
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
09.07.2014, 18:28 #8
Цитата Сообщение от intern Посмотреть сообщение
std::cout << &tmp << std::endl;
уверены?)
это адрес самого указателя
0
AlexVRud
452 / 163 / 41
Регистрация: 04.07.2014
Сообщений: 465
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 / 3232 / 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
1075 / 739 / 115
Регистрация: 12.04.2010
Сообщений: 1,889
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
2596 / 2190 / 819
Регистрация: 24.04.2014
Сообщений: 6,504
10.07.2014, 01:25 #13
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
5
//00684AB8
//00684B90
//00684BD0
//00684C10
//00684E48
разве это одинаковые?
0
Alex5
1075 / 739 / 115
Регистрация: 12.04.2010
Сообщений: 1,889
10.07.2014, 02:19 #14
Цитата Сообщение от Jewbacabra Посмотреть сообщение
разве это одинаковые?
Разные, конечно Я и написал сообщение, чтобы показать, что при отсутствии delete, адреса переменных в динамической памяти будут разными.
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,827
10.07.2014, 08:51 #15
Одинаковый адрес это совпадение или нет?
Это коллапс волновой функции. Не совершайте акта наблюдения за адресом и компилятор скорее всего положит переменную в регистр (у которого адреса нет). Впрочем, он, наверно, все равно положит переменную в регистр, а память выделит чисто для галочки.
0
10.07.2014, 08:51
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


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

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

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