Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Заблокирован
1

Какие конструкции C++ выполняются не там, где написаны?

14.08.2009, 23:29. Просмотров 1351. Ответов 13
Метки нет (Все метки)

Какие конструкции C++ выполняются не там, где написаны?, Я насчитал пока 2 варианта. Подскажите какие есть ещё.
№1.
C++
1
2
3
4
5
6
    for (int i = 0, s = 0; i < 10; i++)
    {
        s += i ;
        // реально оператор i++ из заголовка цикла for
        // выполняется тут, а не в заголовке
    }
№2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int f1 ( int i , int j )
{
    // Реально память под переменную c выделяется тут, а не ниже, где описание
    i++ ;
    j-- ;
    if (i < 7)
    {
        int c ;  // Память под переменную c выделяется не тут, а на входе в ф.-ю
        c = i - j ;
        if (c < 9) goto exit ;
        cout << "error" ;
    }
    return 4 ;
    // -----------------
    exit :
    return 7 ;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2009, 23:29
Ответы с готовыми решениями:

такая проблема: дома 2 компъютера , один с Windows Vista, другой с Windows XP. Там, где Vista - интернет работает как часы, а там, где ХР - интернета
Здравствуйте, у меня такая проблема: дома 2 компъютера , один с Windows Vista, другой с Windows XP....

Какие серьезные программы написаны на Fortran
Может какие используются и поддерживаются на сегодняшний день

Какие известные программы написаны на чистом C и на С++ ?
Если на каком-нибудь сайте найти &quot;Top 10..50..100&quot; программ, то как узнать, на каком они языке...

В чём ошибка.В коде там где коментарий там ошибка поучается.
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; class CMyString{ char *pStr;...

13
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
14.08.2009, 23:47 2
По №1 - читай Стандарт, 6.5.3/1, там абсолютно четко все описано. Не вижу в твоем постинге никаких противоречий требованиям Стандарта.
По №2 - зависит от компилятора. Стандарт не устанавливает никаких требований к моменту выделения памяти под локальную переменную. Таким образом, описанное тобою поведение компилятора никоим образом не противоречит требованиям Стандарта. Мне приходилось встречаться с разными компиляторами, и, уверяю тебя, момент выделения памяти под переменную с сильно зависит как от конкретного компилятора, так и от типа сборки (дебаг/релиз) и от ключей оптимизации компилятора.

Ну и что? При чем здесь "где написаны" конструкции?
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
15.08.2009, 00:12 3
понимаю, каждому хочется открыть свою планету. но неоткрытые - далеко или очень далеко.

"реально оператор i++ из заголовка цикла for"... выполняется между двумя плюсами после i

"// Реально память под переменную c выделяется тут, "... а точнее - между двумя косыми комментария.
0
Заблокирован
15.08.2009, 00:21  [ТС] 4
Цитата Сообщение от CheshireCat Посмотреть сообщение
Не вижу в твоем постинге никаких противоречий требованиям Стандарта.
Цитата Сообщение от CheshireCat Посмотреть сообщение
Таким образом, описанное тобою поведение компилятора никоим образом не противоречит требованиям Стандарта.
А я разве говорил, что о противоречиях стандарту?
Прочитайте внимательней название темы.

Добавлено через 1 минуту 57 секунд
Цитата Сообщение от novi4ok Посмотреть сообщение
понимаю, каждому хочется открыть свою планету. но неоткрытые - далеко или очень далеко.
Причём тут "планеты"?
Я задал конкретный вопрос и огласил свою просьбу.
0
2807 / 1397 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.08.2009, 00:43 5
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
А я разве говорил, что о противоречиях стандарту?
Прочитайте внимательней название темы.
тебе сказали, что определить заведомо где произодйет выделение под память нельзя. все зависит от компилятора, и кокретного балда (дебаг может в разных местах создавать перменную).
0
Заблокирован
15.08.2009, 00:48  [ТС] 6
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
тебе сказали, что определить заведомо где произодйет выделение под память нельзя. все зависит от компилятора, и кокретного балда (дебаг может в разных местах создавать перменную).
Ну а что скажете по примеру №1?
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
15.08.2009, 01:19 7
По примеру 1 могу сказать,что сначала выполняется тело цикла,и сразу после него инкремент.Конкретно в инструкции for так.А по второму не тут и там,а важно,как работает компилятор.Может быть сначала проверяется синтаксис и резервируются переменные,а то что уже видишь ты-это выполнение уже после резервирования переменных.Это надо конкретно смотреть исходники компилятора или читать доку,как там точно всё.Интересно,с чего ты сделал такой вывод,что память резервируется "там,а не там"?
0
Заблокирован
22.08.2009, 02:51  [ТС] 8
Цитата Сообщение от #pragma Посмотреть сообщение
Интересно,с чего ты сделал такой вывод,что память резервируется "там,а не там"?
Из того, что существует оператор goto в одно точку программы
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
22.08.2009, 03:26 9
Вообще-то все операторы написаны на моём мониторе, а выполняются в процессоре (и кажется не моего компутера).

Сопоставлять текстовое представление исходного и исполняемого кодов - глупость.
0
Любитель давать советы
342 / 134 / 14
Регистрация: 12.01.2009
Сообщений: 511
22.08.2009, 06:37 10
Лично я встречал такую реализацию:
Assembler
1
2
3
4
5
6
7
8
9
10
     xor     dx, dx
     jmp    @2
@1:
     inc     dx
@2:
     cmp     dx, [...]
     jnl     @3
...
     jmp     @1
@3:
А про выделение памяти - вопрос не столь глупый, как пытались представить уважаемые товарищи. Это момент выполнения конструктора, что, насколько я помню, достаточно четко привязано к моменту входа в область видимости.
0
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
22.08.2009, 11:44 11
По поводу for - читай книжки, там всё написано

По поводу выделения памяти - в момент вхоа в процедуру сразу выделяется регистровое окно для ВСЕХ переменных процедуры (независимо от того, на каком уровне вложенности описана переменная). Теоретически старые компиляторы могли заниматься расширением стека на каждый новый лексический блок, но современные с вероятностью 99.99% всю _статически_ известную стековую память выделяют при входе в процедуру (массив с переменным числом аргументов НЕ относится к этому случаю). Т.е. автор по сути дела правильно написал мысль "Реально память под переменнЫЕ c выделяется тут, а не ниже, где описание" но выразил её слишком коряво

Alexiski, конструктор НЕ занимается выделением памяти. Контсруктор занимается ТОЛЬКО инициализацией полей
0
Любитель давать советы
342 / 134 / 14
Регистрация: 12.01.2009
Сообщений: 511
23.08.2009, 22:13 12
Цитата Сообщение от Evg Посмотреть сообщение
современные с вероятностью 99.99% всю _статически_ известную стековую память выделяют при входе в процедуру (массив с переменным числом аргументов НЕ относится к этому случаю).
Массив с переменным числом аргументов в стековой памяти? Вы ничего не путаете?
Upd. Понял, вероятно Вы имеете ввиду массивы из вложенных блоков.

Цитата Сообщение от Evg Посмотреть сообщение
Т.е. автор по сути дела правильно написал мысль "Реально память под переменнЫЕ c выделяется тут, а не ниже, где описание" но выразил её слишком коряво
Собственно, и я об этом же, только другими словами, разве нет?

Цитата Сообщение от Evg Посмотреть сообщение
Alexiski, конструктор НЕ занимается выделением памяти. Контсруктор занимается ТОЛЬКО инициализацией полей
Конструктор НЕ занимается выделением памяти, согласен Конструктор занимается ТОЛЬКО инициализацией полей ПОСЛЕ выделения памяти. Следовательно, на момент вызова конструктора память должна быть УЖЕ выделена. Таким образом, фиксация момента вызова конструктора задает одну из границ диапазона, в котором компилятор обязан выделить память. Что я и пытался написать. Но мне показалось, что весь этот ход рассуждения достаточно очевиден, и его не обязательно приводить столь подробно..
0
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
23.08.2009, 22:42 13
Цитата Сообщение от Alexiski Посмотреть сообщение
Массив с переменным числом аргументов в стековой памяти? Вы ничего не путаете?
Upd. Понял, вероятно Вы имеете ввиду массивы из вложенных блоков.
Имелл виду конструкции вида "int a[n];", где n - переменная

Цитата Сообщение от Alexiski Посмотреть сообщение
Собственно, и я об этом же, только другими словами, разве нет?
Цитата Сообщение от Alexiski Посмотреть сообщение
Конструктор НЕ занимается выделением памяти, согласен Конструктор занимается ТОЛЬКО инициализацией полей ПОСЛЕ выделения памяти. Следовательно, на момент вызова конструктора память должна быть УЖЕ выделена. Таким образом, фиксация момента вызова конструктора задает одну из границ диапазона, в котором компилятор обязан выделить память. Что я и пытался написать. Но мне показалось, что весь этот ход рассуждения достаточно очевиден, и его не обязательно приводить столь подробно..
Сложно понять, что ты имел ввиду
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
24.08.2009, 18:21 14
Какая-то тема очень мутная и непонято о чем.
Если хотите обсуждать конструкторы - создайте новую тему.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2009, 18:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Какие действия обычно выполняются в «прологе» подпрограммы?
- сохранение в стеке старого значения регистра EBP - установка в регистре EBP адреса вершины стека...

Какие три операции выполняются при while(*str++)?
#include &lt;stdio.h&gt; using namespace std; int strLength(const char* str){ int size=1; while...

Проверить. какие аксиомы метрического пространства выполняются
Проверить. какие аксиомы метрического пространства выполняются в данном множестве: множество...

Какие управляющие конструкции включает в себя язык С++
Какие управляющие конструкции включает в себя язык С++ Нужно продолжить: циклы, ...


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

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

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