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

Coding style или нет - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
09.02.2012, 19:56     Coding style или нет #1
Услышал сегодня от коллеги такую интересную вещь: есть блоки кода ограниченные командными скобками {}. Так вот, рекомендуется переменные, используемые в блоках и только в них, объявлять в таких блоках. Я например, как правило объявляю переменные в начале подпрограмм. Привычка. Вопрос такой: это чисто coding style рекомендация или есть какое-то практическое значение подобного действия?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 19:58     Coding style или нет #2
Смысл есть. Не слышали про RAII?
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
09.02.2012, 20:12  [ТС]     Coding style или нет #3
Нет, не слышал. Сейчас прочитаю.

Добавлено через 9 минут
Если я правильно понимаю текст по ссылке, то идея в следующем:
C++
1
2
3
4
5
6
7
8
{//начало блока 1
  //....
  {//начало блока 2
    int k;
    int l;
    //...
  }//конец блока 2
}//конец блока 1
В подобном случае переменные k,l существуют только в области видимости блока 2. При этом в конце блока 2 гарантировано вызываются деструкторы. Верно?
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,989
09.02.2012, 20:12     Coding style или нет #4
HighPredator, У меня тоже такая привычка. Но в последнее время я увидел в этом кое-какой смысл.
- Если закомментиваешь какой-то блок, то переменная становится неиспользуемой. Надо ее удалять.
А потом раскомментиваешь - снова объявляй.
- объявление становится визуально ближе к использованию.
- Экономится стековое пространство
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
09.02.2012, 20:19  [ТС]     Coding style или нет #5
Цитата Сообщение от Байт Посмотреть сообщение
- Экономится стековое пространство
Как именно это достигается?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.02.2012, 20:22     Coding style или нет #6
HighPredator, автоматические переменные выделяются на стеке. Таким образом стек не будет занят всеми 100500 переменными, объявленными в начале функции/метода, а будет находится в постоянно подвижном состоянии.
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 20:23     Coding style или нет #7
Цитата Сообщение от HighPredator Посмотреть сообщение
При этом в конце блока 2 гарантировано вызываются деструкторы. Верно?
Да. Кроме того, переменные следует по возможности инициализировать в месте объявления, а если они не изменяются в ходе выполнения алгоритма - то и делать вдобавок константными.
C++
1
2
3
4
5
// плохой код
int n, i, sum;
sum = 0;
for (i = 0, n = 10; i < n; i++)
  sum += i;
C++
1
2
3
4
5
// хороший код
const int n = 10;
int sum = 0;
for (int i = 0; i < n; ++i)
  sum += i;
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
09.02.2012, 20:27  [ТС]     Coding style или нет #8
Цитата Сообщение от silent_1991 Посмотреть сообщение
автоматические переменные выделяются на стеке.
Автоматические в смысле встроенных типов? Остальные в куче?
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.02.2012, 20:32     Coding style или нет #9
HighPredator, пока про устройство памяти процесса не прочитаешь, не поймешь
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
09.02.2012, 20:34     Coding style или нет #10
Цитата Сообщение от HighPredator Посмотреть сообщение
Автоматические в смысле
это если я правильно понимаю все переменные на стеке(static живет по другому немного). при выходе из своей области видимости они уничтожаются, очищаются или другой синоним. как было отмечено в смежных темах, несмотря на их очистку какое то время они лежат нетронутыми пока в стеке есть место. при необходимости затираются. то бишь деструктор объекта созданного в стеке вызовется автоматически при выходи из области видимости. Если в деструкторе класса нет кода на обнуление членов класса - у них есть шанс видимо быть нетронутыми какое то время. Но это мое понимание. могу ошибаться

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
};
 
void function()
{
A a; // автоматич. при выходе из функции вызовется деструктор
 
};
 
int main()
{
 
A a; - автоматическая
 
int b = 0; - автоматическая;
 
return 0;
}
вот так примерно я понял
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
09.02.2012, 20:34     Coding style или нет #11
Цитата Сообщение от HighPredator Посмотреть сообщение
Автоматические в смысле встроенных типов?
Нет. Когда то использовалось ключевое слово auto (в С++ оно и сейчас используется, правда в совсем другом ключе), оно говорило о том, что память под переменную нужно выделить в стеке автоматически. Отсюда и такое название локальных переменных. Но т.к. память для локальных переменных и так выделяется в стеке автоматически, то его (это ключевое слово) перестали использовать.
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
09.02.2012, 20:37  [ТС]     Coding style или нет #12
Vourhey, можете в конкретную литературу сослать?
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 20:38     Coding style или нет #13
Переменные могут размещаться в свободной памяти (куче), статической памяти, регистрах процессора и стеке.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16829 / 5250 / 321
Регистрация: 30.03.2009
Сообщений: 14,141
Записей в блоге: 26
09.02.2012, 21:51     Coding style или нет #14
Цитата Сообщение от HighPredator Посмотреть сообщение
Услышал сегодня от коллеги такую интересную вещь: есть блоки кода ограниченные командными скобками {}. Так вот, рекомендуется переменные, используемые в блоках и только в них, объявлять в таких блоках. Я например, как правило объявляю переменные в начале подпрограмм. Привычка. Вопрос такой: это чисто coding style рекомендация или есть какое-то практическое значение подобного действия?
В случае языка Си это действительно только вопрос стиля, удобства и т.п. В случае Си++ - уже нет, потому как в Си++ есть такие неявные действия как вызов конструктора и деструктора

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// В данном случае мы для переменной str один раз вызовем конструктор и один раз деструктор
{
  std:string str;
  for (....)
  {
    ...
    str = "abc";
    ...
  }
}
 
// В данном случае мы для переменной str будем вызывать конструктор и деструктор
// на каждой итерации цикла. Т.е. попросту увеличим количество кода. Возможно,
// что конкретно в случае std::string оптимизации компилятора сумеют выгребсти весь
// мусор, но в общем случае код увеличится по времени исполнения
{
  for (....)
  {
    std:string str;
    ...
    str = "abc";
    ...
  }
}
Цитата Сообщение от Байт Посмотреть сообщение
- Экономится стековое пространство
Скорее всего ты это почерпал из старых книг (ну или из новых книг, авторы которых содрали инфу из старых книг). 20 лет назад сие было справедливо, потому что компиляторы были слабые. А в современном мире даже самый дерьмовый компилятор оптимальным образом распределит память независимо от того, что и как ты распихаешь по лексическим блокам

Добавлено через 52 секунды
Цитата Сообщение от Сtrl Посмотреть сообщение
Переменные могут размещаться в свободной памяти (куче)
Переменные НЕ могут размещаться в куче. В куче размещается только то, для чего явно были вызваны операторы динамического выделения памяти (malloc, new)
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:56     Coding style или нет #15
Цитата Сообщение от Evg Посмотреть сообщение
Переменные НЕ могут размещаться в куче. В куче размещается только то, для чего явно были вызваны операторы динамического выделения памяти (malloc, new)
Да ладно? А после выделения памяти с помощью new или malloc(), что же оказалось в куче, если не переменная? Если вы считаете, что непременным атрибутом переменной является ее имя, то ссылки решают.
C++
1
2
3
4
int *px = new int;
int &x = *px;
// x - ссылка на память в куче
// чем не переменная?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16829 / 5250 / 321
Регистрация: 30.03.2009
Сообщений: 14,141
Записей в блоге: 26
09.02.2012, 22:08     Coding style или нет #16
Цитата Сообщение от Сtrl Посмотреть сообщение
Если вы считаете, что непременным атрибутом переменной является ее имя
Ну разумеется. "x" и "px" - это переменные. То, что тебе вернуло new - это неправильно называть словом "переменная". Хотя для этого часто используют термин "динамически выделенный объект". Но это не есть эквивалент понятия "переменная"
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:19     Coding style или нет #17
Цитата Сообщение от Evg Посмотреть сообщение
То, что тебе вернуло new - это неправильно называть словом "переменная". Хотя для этого часто используют термин "динамически выделенный объект"
Согласен, я был не прав, это действительно не переменная. Но благодаря ссылкам с этой памятью можно работать как с переменной.
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
09.02.2012, 22:19  [ТС]     Coding style или нет #18
Подведу промежуточный итог: для встроенных типов не имеет значения место объявления. Для типов, имеющих конструктор/деструктор оба вызываются в блоке объявления. Все так? А, кстати, что с глобальными переменными?
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:21     Coding style или нет #19
Цитата Сообщение от HighPredator Посмотреть сообщение
А, кстати, что с глобальными переменными?
Они размещаются в статической памяти. На вашем месте я бы их избегал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 22:26     Coding style или нет
Еще ссылки по теме:

Полиндром или нет? C++
C++ Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет
C++11 в production, да или нет? C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16829 / 5250 / 321
Регистрация: 30.03.2009
Сообщений: 14,141
Записей в блоге: 26
09.02.2012, 22:26     Coding style или нет #20
Цитата Сообщение от Сtrl Посмотреть сообщение
Но благодаря ссылкам с этой памятью можно работать как с переменной
Да. Но только по косвенности (т.е. через указатель). В то время, как к переменной можно обратиться напрямую (т.е., условно говоря, по заранее известному для компилятора месту)

Цитата Сообщение от HighPredator Посмотреть сообщение
Подведу промежуточный итог: для встроенных типов не имеет значения место объявления
С точки зрения построения кода - да (а для Си ещё и для любого типа, а не только для встроенного). С точки зрения удобства, стиля и т.п. - нет.

Цитата Сообщение от Сtrl Посмотреть сообщение
На вашем месте я бы их избегал
Более правильным было бы сказать, что по возможности надо строить программу так, чтобы не было глобальных переменных. Но не доводить до фанатизма и не писать лишние килобайты кода только ради того, чтобы не было одной глобальной переменной
Yandex
Объявления
09.02.2012, 22:26     Coding style или нет
Ответ Создать тему
Опции темы

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