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

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

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

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

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

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++
Два вопроса: 1) Чем отличается запись: int a = 10; От: int a(10); 2) Что обозначает данная запись: int *a = new int (3); ...

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
09.07.2014, 17:54     Объявление переменной в цикле #2
Цитата Сообщение от intern Посмотреть сообщение
Будет ли переменная tmp объявляться при каждой итерации или компилятор оптимизирует такое объявление?
Одинаковый адрес это совпадение или нет?
память же выделяется под неё статически,а не динамически
nmcf
5251 / 4571 / 1535
Регистрация: 14.04.2014
Сообщений: 18,170
09.07.2014, 17:58     Объявление переменной в цикле #3
А почему он должен быть разный? Она же статическая.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
09.07.2014, 18:07     Объявление переменной в цикле #4
Говоря точнее, переменная не статическая, а стековая. Память под такие переменные выделяется и освобождается предсказуемо, а главное - "бесплатно" по времени. Поэтому здесь и оптимизировать нечего. Так что с одной стороны одинаковые адреса - ожидаемое поведение и было бы весьма странно, если бы они менялись. С другой стороны, на такое поведение нет формальной гарантии и писать код, рассчитывающий на такую особенность, не лучшая затея, даже несмотря на то, что он будет работать.
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;
}
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
09.07.2014, 18:26     Объявление переменной в цикле #6
Цитата Сообщение от intern Посмотреть сообщение
и при динамическом выделении адреса также одинаковые
А вот это уже вообще совсем не гарантированное поведение. Если в случае со стековыми переменными на проблемы можно нарваться разве что на какой-то экзотической архитектуре, то тут можно налететь на "неодинаковость" при самых разных обстоятельствах: сменив компилятор, использовав переопределение выделителей памяти, а то и просто переключившись из дебага в релиз.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
09.07.2014, 18:26     Объявление переменной в цикле #7
Цитата Сообщение от intern Посмотреть сообщение
Хорошо, но и в при динамическом выделении адреса также одинаковые
Убери delete и будут разные..
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
09.07.2014, 18:28     Объявление переменной в цикле #8
Цитата Сообщение от intern Посмотреть сообщение
std::cout << &tmp << std::endl;
уверены?)
это адрес самого указателя
AlexVRud
442 / 152 / 38
Регистрация: 04.07.2014
Сообщений: 430
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
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
09.07.2014, 19:30     Объявление переменной в цикле #10
Странно, а почему вы считаете что адреса должны быть разные, если вы тут-же удаляете указатель.
Tulosba
:)
Эксперт С++
4393 / 3236 / 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 расположена на стеке.
Alex5
1048 / 711 / 104
Регистрация: 12.04.2010
Сообщений: 1,789
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
Эксперт PHP
2260 / 1924 / 720
Регистрация: 24.04.2014
Сообщений: 5,591
10.07.2014, 01:25     Объявление переменной в цикле #13
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
5
//00684AB8
//00684B90
//00684BD0
//00684C10
//00684E48
разве это одинаковые?
Alex5
1048 / 711 / 104
Регистрация: 12.04.2010
Сообщений: 1,789
10.07.2014, 02:19     Объявление переменной в цикле #14
Цитата Сообщение от Jewbacabra Посмотреть сообщение
разве это одинаковые?
Разные, конечно Я и написал сообщение, чтобы показать, что при отсутствии delete, адреса переменных в динамической памяти будут разными.
Renji
1875 / 1273 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
10.07.2014, 08:51     Объявление переменной в цикле #15
Одинаковый адрес это совпадение или нет?
Это коллапс волновой функции. Не совершайте акта наблюдения за адресом и компилятор скорее всего положит переменную в регистр (у которого адреса нет). Впрочем, он, наверно, все равно положит переменную в регистр, а память выделит чисто для галочки.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
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
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 10:43     Объявление переменной в цикле #17
Цитата Сообщение от dzrkot Посмотреть сообщение
в зависимости от порядка delete tmp3 будет создаваться в разных ячейках памяти
Это всё зависит от реализации.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
10.07.2014, 10:46     Объявление переменной в цикле #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Это всё зависит от реализации.
мб, для меня уже не играет роли в какой ячейке памяти что будет храниться, смысла в таких знаниях не вижу))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 10:50     Объявление переменной в цикле
Еще ссылки по теме:

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

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

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

Объявление переменной, как вводить свои числа - C++
#include &lt;iostream&gt; using namespace std; int main() { double a, b, c, p=(a+b+c)*0.5; cout&lt;&lt;&quot;Ploshchad treugolnika.\n&quot;; ...


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

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

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