Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.81.214] |
|
Страницы: (42) « Первая ... 31 32 [33] 34 35 ... 41 42 ( Перейти к последнему сообщению ) |
Сообщ.
#481
,
|
|
|
Цитата Pacific @ Вопрос еще, а часто ли вообще нужно создавать переменные встроенных типов без инициализации? А меня волнует. Если так сделать, скоро программы на C++ будут медленнее, чем на C#. И зачем тогда C++? |
Сообщ.
#482
,
|
|
|
В блоге Скотта есть очень хороший комментарий:
Цитата If we are going to break backwards compatibility, this seems like a half-measure: int x; // always zero-initialized int x = void; // never zero-initialized Why should we still allow int x; to compile at all? The problem is that allowing the implicit zero initialization can still hide bugs that sanitizers would no longer be able to find. All it does is make buggy code produce repeatable results, which can make it harder, not easier, to find the bug. How about making it so you always have to specify an initializer or void? Действительно, зачем вообще разрешать "int x;"? Нужно всегда заставлять инициализировать, либо каким-то значением, либо void'ом. Так будет меньше ошибок. |
Сообщ.
#483
,
|
|
|
Цитата Pacific @ В блоге Скотта есть очень хороший комментарий Ничего хорошего в этом комментарии нет template<class T> void foo() { T t; } |
Сообщ.
#484
,
|
|
|
MyNameIsIgor
template<class T> void foo() { T t = T(); или T t = void; } И всего делов. |
Сообщ.
#485
,
|
|
|
Цитата Pacific @ И всего делов Если сложно расставить = void в старом коде, то что уже говорить о том, что нужно будет расставлять = T()? Добавлено Так можно было бы делать изначально. |
Сообщ.
#486
,
|
|
|
Абстрактный пример в этой теме уже был. Что б не искать, перепостчу по памяти. Даже чуть улучшу.
Допустим, программер написал if (shMem == 0) shMem = mmap(0, SHM_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED, GetFileNameFromUser(), 0); |
Сообщ.
#487
,
|
|
|
MyNameIsIgor
Я вообще-то по-прежнему против всех этих штучек с дефолтовым нулем. Я скорее за то, чтобы просто запретить "int x;" для POD-типов. Написать "int x = value;" или "SomeStruct y = {};" руки не отсохнут. P.S. И добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации. |
Сообщ.
#488
,
|
|
|
Цитата Pacific @ Козлы (без обид, не про вас Pacific), расстрелять. И добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации. |
Сообщ.
#489
,
|
|
|
Цитата Pacific @ MyNameIsIgor template<class T> void foo() { T t = T(); или T t = void; } И всего делов. Ну так я про то и говорил Мне такой вариант не очень нравится. Но таки это лучше того, что есть сейчас. |
Сообщ.
#490
,
|
|
|
Цитата Pacific @ Действительно, зачем вообще разрешать "int x;"? Нужно всегда заставлять инициализировать, либо каким-то значением, либо void'ом. Так будет меньше ошибок. Лучше бы ввели какую прагму (инициализировать по-умолчанию, оставить как есть). И, имхо, лучше не нулем, а каким-либо предопределенным "значением ошибки". В дебаг/бета-сборке можно было бы ассертов наставить. А в продакшен-коде все эти двоиные инициализации выкинуть. |
Сообщ.
#491
,
|
|
|
Цитата Pacific @ А смысл тогда что-то менять? Как раньше с разбегу писали без всяких значений, так теперь руки быстро привыкнут к = void, или понапишут плагинов в любимым IDE. Я вообще-то по-прежнему против всех этих штучек с дефолтовым нулем. Я скорее за то, чтобы просто запретить "int x;" для POD-типов. Написать "int x = value;" или "SomeStruct y = {};" руки не отсохнут. P.S. И добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации. |
Сообщ.
#492
,
|
|
|
Цитата Qraizer @ +1. А смысл тогда что-то менять? Как раньше с разбегу писали без всяких значений, так теперь руки быстро привыкнут к = void, или понапишут плагинов в любимым IDE. |
Сообщ.
#493
,
|
|
|
Цитата Qraizer @ Абстрактный пример в этой теме уже был. Что б не искать, перепостчу по памяти. Даже чуть улучшу. Допустим, программер написал if (shMem == 0) shMem = mmap(0, SHM_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED, GetFileNameFromUser(), 0); И в чем тут ошибка? |
Сообщ.
#494
,
|
|
|
Цитата Pacific @ добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации. int i = void; extern_function(&i); ? |
Сообщ.
#495
,
|
|
|
Цитата applegame @ И в чем тут ошибка? Выделение памяти будет только в случае предварительной инициализации shMem нулем (NULL). Если предварительной инициализации не было (мусор), то выделение будет случайным образом. А код дурацкий. Имхо, имеет смысл так делать только в случае перевыделения по непонятным заранее зависимостям. Если выделение однократное, проверять нужно не сперва, а потом, со значением MAP_FAILED. |