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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,468
Записей в блоге: 2
#1

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

09.02.2012, 19:56. Просмотров 3042. Ответов 60
Метки нет (Все метки)

Услышал сегодня от коллеги такую интересную вещь: есть блоки кода ограниченные командными скобками {}. Так вот, рекомендуется переменные, используемые в блоках и только в них, объявлять в таких блоках. Я например, как правило объявляю переменные в начале подпрограмм. Привычка. Вопрос такой: это чисто coding style рекомендация или есть какое-то практическое значение подобного действия?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 19:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Coding style или нет (C++):

Ошибка с массивами, хотя формально её нет (похожи ли массивы или нет?) - C++
Всем доброго времени суток!) В общем имею такую великолепную чтуку, она должна говорить мне, похожи ли массивы или нет, массив должен...

Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет - C++
Дана последовательность символов, состоящая из слов. Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если...

Как разбить код на 2 функции: Coding и Decoding? - C++
#include <iostream> #include <vector> #include <map> #include <list> #include <fstream> using namespace std; ...

Где можго почитать о Coding Convention для C++ на русскос языке? - C++
Я не смог нагуглить.

Как найти текст в файле и возвратить 0 или 1 в зависимости от того,найдено или нет? - C++
bool fnd(char* fn,string stf) { string s; ifstream ifs(fn); while (!ifs.eof()) { getline(ifs,s); ...

Вывести True или False в зависимости от того, имеют три заданных целых числа одинаковую четность или нет - C++
Всем привет! Помогите, пожалуйста в решении задачи. Знаю, что задачи более,или менее лёгкие,но я в c++ почти ничего не смыслю, а лабы...

60
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 19:58 #2
Смысл есть. Не слышали про RAII?
1
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,468
Записей в блоге: 2
09.02.2012, 20:12  [ТС] #3
Нет, не слышал. Сейчас прочитаю.

Добавлено через 9 минут
Если я правильно понимаю текст по ссылке, то идея в следующем:
C++
1
2
3
4
5
6
7
8
{//начало блока 1
  //....
  {//начало блока 2
    int k;
    int l;
    //...
  }//конец блока 2
}//конец блока 1
В подобном случае переменные k,l существуют только в области видимости блока 2. При этом в конце блока 2 гарантировано вызываются деструкторы. Верно?
0
Байт
Эксперт C
16141 / 10419 / 1551
Регистрация: 24.12.2010
Сообщений: 19,723
09.02.2012, 20:12 #4
HighPredator, У меня тоже такая привычка. Но в последнее время я увидел в этом кое-какой смысл.
- Если закомментиваешь какой-то блок, то переменная становится неиспользуемой. Надо ее удалять.
А потом раскомментиваешь - снова объявляй.
- объявление становится визуально ближе к использованию.
- Экономится стековое пространство
1
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,468
Записей в блоге: 2
09.02.2012, 20:19  [ТС] #5
Цитата Сообщение от Байт Посмотреть сообщение
- Экономится стековое пространство
Как именно это достигается?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.02.2012, 20:22 #6
HighPredator, автоматические переменные выделяются на стеке. Таким образом стек не будет занят всеми 100500 переменными, объявленными в начале функции/метода, а будет находится в постоянно подвижном состоянии.
1
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 20:23 #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;
1
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,468
Записей в блоге: 2
09.02.2012, 20:27  [ТС] #8
Цитата Сообщение от silent_1991 Посмотреть сообщение
автоматические переменные выделяются на стеке.
Автоматические в смысле встроенных типов? Остальные в куче?
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.02.2012, 20:32 #9
HighPredator, пока про устройство памяти процесса не прочитаешь, не поймешь
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
09.02.2012, 20:34 #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;
}
вот так примерно я понял
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
09.02.2012, 20:34 #11
Цитата Сообщение от HighPredator Посмотреть сообщение
Автоматические в смысле встроенных типов?
Нет. Когда то использовалось ключевое слово auto (в С++ оно и сейчас используется, правда в совсем другом ключе), оно говорило о том, что память под переменную нужно выделить в стеке автоматически. Отсюда и такое название локальных переменных. Но т.к. память для локальных переменных и так выделяется в стеке автоматически, то его (это ключевое слово) перестали использовать.
1
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,468
Записей в блоге: 2
09.02.2012, 20:37  [ТС] #12
Vourhey, можете в конкретную литературу сослать?
0
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 20:38 #13
Переменные могут размещаться в свободной памяти (куче), статической памяти, регистрах процессора и стеке.
1
Evg
Эксперт CАвтор FAQ
17936 / 6165 / 411
Регистрация: 30.03.2009
Сообщений: 16,925
Записей в блоге: 27
09.02.2012, 21:51 #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)
1
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:56 #15
Цитата Сообщение от Evg Посмотреть сообщение
Переменные НЕ могут размещаться в куче. В куче размещается только то, для чего явно были вызваны операторы динамического выделения памяти (malloc, new)
Да ладно? А после выделения памяти с помощью new или malloc(), что же оказалось в куче, если не переменная? Если вы считаете, что непременным атрибутом переменной является ее имя, то ссылки решают.
C++
1
2
3
4
int *px = new int;
int &x = *px;
// x - ссылка на память в куче
// чем не переменная?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 21:56
Привет! Вот еще темы с ответами:

Опечатка или нет? - C++
class my_class { public: my_class() { a = b = 0; } my_class(constint...

симафор или нет? - C++
ПРивет всем! написал программу для следующего задания с использованием симафора: Написать программу, создающую два потока. Оба...

C++11 в production, да или нет? - C++
Всем привет. Выбил все-таки разрешение юзать С++11 на работе, по мелочи, лямбды вместо предикатов, range-based-for, auto. Сегодня наш тех....

Палиндром или нет? - C++
Определить, является ли заданное натуральное число палиндромом, т.е. таким, десятичная запись которого читается одинаково слева направо и...


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

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

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