Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3

Coding style или нет

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

Студворк — интернет-сервис помощи студентам
Услышал сегодня от коллеги такую интересную вещь: есть блоки кода ограниченные командными скобками {}. Так вот, рекомендуется переменные, используемые в блоках и только в них, объявлять в таких блоках. Я например, как правило объявляю переменные в начале подпрограмм. Привычка. Вопрос такой: это чисто coding style рекомендация или есть какое-то практическое значение подобного действия?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2012, 19:56
Ответы с готовыми решениями:

border-style нет нужного
Не нашел такого стиля чтобы например я делаю черным рамку,4 px, первый слой абсолютно черный(000) по всему периментру, след. чуть...

canvas.не меняется brush.style & pen.style
На форме лежит имэдж нужно часть его обвести (это в идеале). Я это решил реализовать так поместить сверху другой имэг и на его канве...

Как удалить стиль определенный между <style></style>
Привет. Есть тестовый пример : #foo{color:green;} &lt;div id=&quot;foo&quot; style=&quot;color:red&quot;&gt;hello&lt;/div&gt; Как очистить стили...

60
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 19:58
Смысл есть. Не слышали про RAII?
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.02.2012, 20:12  [ТС]
Нет, не слышал. Сейчас прочитаю.

Добавлено через 9 минут
Если я правильно понимаю текст по ссылке, то идея в следующем:
C++
1
2
3
4
5
6
7
8
{//начало блока 1
  //....
  {//начало блока 2
    int k;
    int l;
    //...
  }//конец блока 2
}//конец блока 1
В подобном случае переменные k,l существуют только в области видимости блока 2. При этом в конце блока 2 гарантировано вызываются деструкторы. Верно?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.02.2012, 20:12
HighPredator, У меня тоже такая привычка. Но в последнее время я увидел в этом кое-какой смысл.
- Если закомментиваешь какой-то блок, то переменная становится неиспользуемой. Надо ее удалять.
А потом раскомментиваешь - снова объявляй.
- объявление становится визуально ближе к использованию.
- Экономится стековое пространство
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.02.2012, 20:19  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
- Экономится стековое пространство
Как именно это достигается?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.02.2012, 20:22
HighPredator, автоматические переменные выделяются на стеке. Таким образом стек не будет занят всеми 100500 переменными, объявленными в начале функции/метода, а будет находится в постоянно подвижном состоянии.
1
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 20:23
Цитата Сообщение от 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
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.02.2012, 20:27  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
автоматические переменные выделяются на стеке.
Автоматические в смысле встроенных типов? Остальные в куче?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
09.02.2012, 20:32
HighPredator, пока про устройство памяти процесса не прочитаешь, не поймешь
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
09.02.2012, 20:34
Цитата Сообщение от 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
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.02.2012, 20:34
Цитата Сообщение от HighPredator Посмотреть сообщение
Автоматические в смысле встроенных типов?
Нет. Когда то использовалось ключевое слово auto (в С++ оно и сейчас используется, правда в совсем другом ключе), оно говорило о том, что память под переменную нужно выделить в стеке автоматически. Отсюда и такое название локальных переменных. Но т.к. память для локальных переменных и так выделяется в стеке автоматически, то его (это ключевое слово) перестали использовать.
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.02.2012, 20:37  [ТС]
Vourhey, можете в конкретную литературу сослать?
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 20:38
Переменные могут размещаться в свободной памяти (куче), статической памяти, регистрах процессора и стеке.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.02.2012, 21:51
Цитата Сообщение от 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
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:56
Цитата Сообщение от Evg Посмотреть сообщение
Переменные НЕ могут размещаться в куче. В куче размещается только то, для чего явно были вызваны операторы динамического выделения памяти (malloc, new)
Да ладно? А после выделения памяти с помощью new или malloc(), что же оказалось в куче, если не переменная? Если вы считаете, что непременным атрибутом переменной является ее имя, то ссылки решают.
C++
1
2
3
4
int *px = new int;
int &x = *px;
// x - ссылка на память в куче
// чем не переменная?
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.02.2012, 22:08
Цитата Сообщение от Сtrl Посмотреть сообщение
Если вы считаете, что непременным атрибутом переменной является ее имя
Ну разумеется. "x" и "px" - это переменные. То, что тебе вернуло new - это неправильно называть словом "переменная". Хотя для этого часто используют термин "динамически выделенный объект". Но это не есть эквивалент понятия "переменная"
2
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:19
Цитата Сообщение от Evg Посмотреть сообщение
То, что тебе вернуло new - это неправильно называть словом "переменная". Хотя для этого часто используют термин "динамически выделенный объект"
Согласен, я был не прав, это действительно не переменная. Но благодаря ссылкам с этой памятью можно работать как с переменной.
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.02.2012, 22:19  [ТС]
Подведу промежуточный итог: для встроенных типов не имеет значения место объявления. Для типов, имеющих конструктор/деструктор оба вызываются в блоке объявления. Все так? А, кстати, что с глобальными переменными?
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:21
Цитата Сообщение от HighPredator Посмотреть сообщение
А, кстати, что с глобальными переменными?
Они размещаются в статической памяти. На вашем месте я бы их избегал.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.02.2012, 22:26
Цитата Сообщение от Сtrl Посмотреть сообщение
Но благодаря ссылкам с этой памятью можно работать как с переменной
Да. Но только по косвенности (т.е. через указатель). В то время, как к переменной можно обратиться напрямую (т.е., условно говоря, по заранее известному для компилятора месту)

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

Цитата Сообщение от Сtrl Посмотреть сообщение
На вашем месте я бы их избегал
Более правильным было бы сказать, что по возможности надо строить программу так, чтобы не было глобальных переменных. Но не доводить до фанатизма и не писать лишние килобайты кода только ради того, чтобы не было одной глобальной переменной
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.02.2012, 22:26
Помогаю со студенческими работами здесь

Задавать свойство лучше в style(CSS) или в HTML?
1)&lt;img alt=&quot;&quot; src=&quot;images/tuner.jpg&quot; width=&quot;250px&quot; height=&quot;250px&quot; align=&quot;right&quot;&gt; 2)&lt;img alt=&quot;&quot; src=&quot;images/tuner.jpg&quot; style=&quot;width:...

Где хранится element.style или изменить width дива
Добрый день уважаемые форумчане. Весь день бьюсь над проблемой... Сил больше нет... Подскажите. Правлю шаблон сайта. У меня 2 дива...

Присвоить div-у атрибут class или style и вписать в них данные
Здравствуйте Есть див &lt;div id='div' contenteditable=&quot;true&quot;&gt;///&lt;/div&gt; Необходимо присвоить ему атрибут class или style и вписать в них...

SOS Coding Input
Добрый день. Ребята очень нужна помощь на вас надежда. Смотрите суть такова: Если таблица в базе MYSQL на сервере. Я...

Good Coding Practices
123 Добавлено через 1 час 1 минуту Всем привет. Примитивнейшая задача: два класса обмениваются значениями переменных. Два объекта,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru