Re[24]: List(T).Insert
От: Юрий Жмеренецкий ICQ 380412032
Дата: 09.07.08 13:45
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, WolfHound, Вы писали:


RO>>>Итак, какую гарантию обеспечивает List(T).Insert?

WH>>strong exception safety guarantee те если вылетит исключение то List останется в неизменном состоянии.

WH>> this._size++;

RO>И всё же, что произойдет, если _size = 2³²-1?

checked

By default, if an expression produces a value that is outside the range of the destination type, constant expressions cause compile-time errors, and non-constant expressions are evaluated at run-time and raise exceptions. However, the checked keyword can be used to enable checking if it is suppressed globally by compiler options or environment configuration.


WH>>Все так просто именно из-за отсутствия RAII...

RO>Тогда уже из-за отсутствия бросающихся конструкторов копий
Автор: CEMb
Дата: 25.05.06
. Я правильно понял, что в .NET такого понятия вообще нет? Что вместо него, Clone() какой-нибудь?


Там все хуже =) Приблизительно так: boost::shared_ptr<std::list<boost::shared_ptr<Object> > >
Re[25]: List(T).Insert
От: Юрий Жмеренецкий ICQ 380412032
Дата: 09.07.08 14:14
Оценка:
Здравствуйте, WolfHound, Вы писали:
Однако...

.NET Framework 2.0 представляет Ограниченные области выполнения (Constrained Execution Regions – CER), которые налагают ограничения как на среду выполнения, так и на разработчика.
...
Чтобы среда выполнения подготовила CER, ей должно быть известно, что код этой CER и схема вызываемых функций поддерживают ограничения, необходимые для выполнения в CER. Для этого .NET Framework предоставляет ReliabilityContractAttribute (атрибут контракта надежности) в пространстве имен System.Runtime.ConstrainedExecution.
...
Для корневых методов схемы вызываемых функций CER допустимыми являются только три комбинации значений Cer и Consistency
[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

Первая показывает, что в исключительных условиях метод может дать сбой, но в самом худшем случае он повредить лишь конкретный экземпляр; домен приложения и состояние всего процесса останутся нетронутыми. Вторая показывает, что метод может дать сбой, но даже в этом случае все состояние по-прежнему будет действительным. Это соответствует тому, что сообщество C++-разработчиков называет «строгая гарантия исключения», имея ввиду, что действие завершается или дает сбой без негативных побочных эффектов или формирования исключения.
...
(c)Stephen Toub – технический редактор журнала «MSDN Magazine»
http://www.vbnet.ru/articles/showarticle.aspx?id=209

Определение строгой гарантии несколько неточно, ну да ладно.

Далее:

So, I wanted to have a look on Array.Copy(), this is how it shows in .NET Refelctor:

[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
public static void Copy(Array sourceArray, int sourceIndex, 
  Array destinationArray, int destinationIndex, int length)
{
  Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length, false);
}

http://waldev.blogspot.com/2008/05/efficiently-copying-items-from-one.html

Re: Google C++ Style Guide
От: Константин Черногория  
Дата: 10.07.08 00:04
Оценка:
Добрый вечер, night beast, Вы писали про Google C++ Style Guide.

В целом несомненный зачот, правда несколько пунктов не очень.

define guard — это потому шо убогие компиляторы не знают pragma once

Про аргументы со значениями по умолчанию — не согласен категорически. Не фиг копи-пэйстить то, шо ты не знаешь как работает.

Integer Types — а шо делать если если нужен тип integer 8 bit или больше (например цикл от 0 до 100), но который будет работать максимально быстро и на 32bit и на 64-bit? (т.е. шоб число было 32-bit на win32 и 64-bit на win64).

Line length — щас спецом посмотрел, при традиционно открытом тулбаре "solution explorer" без горизонтального скроллинга на меньшем из 2-х мониторов влезает 170 символов (MSDEV 2005, шрифты и DPI по умолчанию). Это всё-таки побольше чем 80, да и кто в наше время смотрит на 80x25 текстовый режим?

int n; // Bad — meaningless. — если эта n используется только в следующих 5-10 строках кода, то фсё OK.

Всё остальное — ППКС! Особенно про исключения и RTTI.
Re[12]: Google C++ Style Guide
От: Константин Черногория  
Дата: 10.07.08 00:15
Оценка:
Добрый вечер, jazzer, Вы писали:

J>Кстати, в СОМ наследования нет вообще, есть только запросы QueryInterface, так что тут сложно говорить, напоминает оно СОМ или нет.


Я понимаю, шо это не имеет отношения к вашей беседе с MShura Тем не менее, хочу заметить, шо в COM есть агрегирование, которое позволяет в некоторых случаях унаследовать не тока интерфейсы, но и реализацию.
Re[2]: Google C++ Style Guide
От: landerhigh Пират  
Дата: 10.07.08 00:43
Оценка:
Здравствуйте, Константин, Вы писали:

К>Добрый вечер, night beast, Вы писали про Google C++ Style Guide.


К>В целом несомненный зачот, правда несколько пунктов не очень.

К>define guard — это потому шо убогие компиляторы не знают pragma once
Интересно, если сравнить два компилятора, один тот самый, который про эту прагму знает с младенчества, но доступен по сути только для одной платформы, и другой, который не знает, зато существует для практически любой платформы, какой из них следует называть убогим? Кстати, этот второй компилятор тоже в курсе про эту прагму с какой-то достаточно древней версии. Что не отменяет факта, что какой-то код нужно будет компилировать под нечто, для чего существует ровно один компилятор, который, сюрприз, не в курсе про какие-то там прагмы?
К>Line length — щас спецом посмотрел, при традиционно открытом тулбаре "solution explorer" без горизонтального скроллинга на меньшем из 2-х мониторов влезает 170 символов (MSDEV 2005, шрифты и DPI по умолчанию). Это всё-таки побольше чем 80, да и кто в наше время смотрит на 80x25 текстовый режим?
А Кнута надо бы почитать, что ли. Для человека наибольшая комфортная ширина строки текста — примерно 66 символов. Видел когда-нибудь газету, где полосы занимали бы всю ширину листа? Как думаешь, почему?
К>Всё остальное — ППКС! Особенно про исключения и RTTI.
Каменный век
www.blinnov.com
Re[13]: Google C++ Style Guide
От: crable США  
Дата: 10.07.08 03:45
Оценка:
Здравствуйте, MShura, Вы писали:


MS>>>>>Этот подход напоминает COM. Интерфейсы отдельно, реализации отдельно.


[snip]

MS>Например в моей практике gcc при компиляции драйверов для Mac OS отказывался компилить, если видел множественное наследование, даже если второй наследуемый класс был простой класс запрещающий копирование.


MS>Google конечно не пишет драйверов для Mac, но возможно на каких-то целевых для них платформах компилятор просто не поддерживает множественное наследование.


это вряд-ли, у них ведь не запрещено множественное наследование само по себе, а только множественное наследование от классов с реализацией.

struct IFoo
{
virtual void foo() = 0;
};

struct IBar
{
virtual void bar() = 0;
};

class Foo : public IFoo
{
public:
virtual void foo() {}
};

class Bar : public IBar
{
public:
virtual void bar() {}
};

class FooBar1 : public IFoo, public IBar // так можно
{
public:
virtual void foo() {}
virtual void bar() {}
};

class FooBar2 : public Foo, public Bar // а так уже нет
{
};


если бы они ориентировались на компиляторы без множественного наследования, то запрещали бы оба варианта, да и возможность исключений из этого правила, тоже говорит, что дело не в компиляторах.

Вообще странно, вроде как они стараются хороших разработчиков набирать, а потом дают им правила рассчитанные на новичков, которые могут учудить что-нибудь с множественным наследованием или еще чем-нибудь.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[3]: Google C++ Style Guide
От: Аноним  
Дата: 10.07.08 03:49
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Здравствуйте, Константин, Вы писали:


К>>Добрый вечер, night beast, Вы писали про Google C++ Style Guide.


К>>В целом несомненный зачот, правда несколько пунктов не очень.

К>>define guard — это потому шо убогие компиляторы не знают pragma once
L>Интересно, если сравнить два компилятора, один тот самый, который про эту прагму знает с младенчества, но доступен по сути только для одной платформы, и другой, который не знает, зато существует для практически любой платформы, какой из них следует называть убогим? Кстати, этот второй компилятор тоже в курсе про эту прагму с какой-то достаточно древней версии.

А почему ты думаешь, что он этот другой компилятор назвал убогим, если он "в курсе про эту прагму с какой-то достаточно древней версии"?

L> Что не отменяет факта, что какой-то код нужно будет компилировать под нечто, для чего существует ровно один компилятор, который, сюрприз, не в курсе про какие-то там прагмы?


+1

[snip]
Re[3]: Google C++ Style Guide
От: Константин Черногория  
Дата: 10.07.08 12:53
Оценка: -2
Здравствуйте, landerhigh, Вы писали:


К>>В целом несомненный зачот, правда несколько пунктов не очень.

К>>define guard — это потому шо убогие компиляторы не знают pragma once
L>Интересно, если сравнить два компилятора, один тот самый, который про эту прагму знает с младенчества, но доступен по сути только для одной платформы, и другой, который не знает, зато существует для практически любой платформы, какой из них следует называть убогим?
Если "тот самый" это MSDEV то он компилирует под десятки платформ (win32/64, всякие ARMы с WinMobile, Alpha, MIPS, PowerPC, оба Xbox-а, Zune, и т.п.).
А если "другой" это GCC, то ты ж сам написал шо он тоже знает

L>Что не отменяет факта, что какой-то код нужно будет компилировать под нечто, для чего существует ровно один компилятор, который, сюрприз, не в курсе про какие-то там прагмы?

Интересно, сколько процентов разработчиков пишут что-то на C++ под платформы, куда не компилит ни MSDEV ни GCC?

L>Для человека наибольшая комфортная ширина строки текста — примерно 66 символов. Видел когда-нибудь газету, где полосы занимали бы всю ширину листа? Как думаешь, почему?

Думаю потому шо небольшая заметка из пары длинных строк смотрится хреновей, чем такая же "квадратная".
Ещё потому, что газеты печатают на бумаге большого размера, а читают где ни попадя — поэтому горизонтальный скроллинг заключается в нетривиальных манипуляциях с газетой: думаю, постоянно её перескладывать надоест уже строчке на пятой.

BTW в коде который я пишу строки длиннее 80 символов почти исключительно комментарии — полстраницы комментов IMO портят читаемость кода, несмотря на подсветку (особенно если эти полстраницы пишутся не для людей, а для роботов вроде doxygen).

К>>Всё остальное — ППКС! Особенно про исключения и RTTI.

L>Каменный век
Про исключения — http://www.joelonsoftware.com/items/2003/10/13.html
RTTI IMHO просто бесполезен, как и например виртуальное наследование, и ещё пара конструкций языка.
Re[4]: Google C++ Style Guide
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.07.08 13:01
Оценка: 1 (1) +3
Здравствуйте, Константин, Вы писали:

К>Про исключения — http://www.joelonsoftware.com/items/2003/10/13.html


Феерический бред.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Google C++ Style Guide
От: remark Россия http://www.1024cores.net/
Дата: 10.07.08 13:10
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Константин, Вы писали:


К>>Про исключения — http://www.joelonsoftware.com/items/2003/10/13.html


E>Феерический бред.


Полностью поддерживаю. Это похоже на мнение человека, который 10 лет писал на С, а потом увидел исключения, и попытался их использовать как будто это ещё один способ локальной передачи управления, аналогичный while/if/goto. Естественно, ничего хорошего при таком подходе не получится.
Не говоря уже о том, что в Java/C# такой подход вообще не будет работать, т.к. потенциально практически каждая строчка кода бросает исключения.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: Google C++ Style Guide
От: Константин Черногория  
Дата: 10.07.08 15:23
Оценка: -3 :)
Здравствуйте, remark, Вы писали:

E>>Феерический бред.


R>Полностью поддерживаю. Это похоже на мнение человека, который 10 лет писал на С, а потом увидел исключения, и попытался их использовать как будто это ещё один способ локальной передачи управления, аналогичный while/if/goto.


Ты собираешься спорить с тем что исключения это ещё один способ передачи управления? Только у while/if и прочих есть скобочки и их видно, а пролетающее мимо исключение ни хрена не видно.

У goto и исключений много общего. Обоих не видно читая код, и оба отнюдь не локальная передача управления, а вполне себе глобальная. Именно из-за этих свойств goto не рекомендуется к использованию. Исключения некоторые рекомендуют, хотя от goto они отличаются только тем шо аккуратнее обходятся с данными на стеке (зовёт деструкторы), и ещё тем шо переход выполняется не на метку а Х3 куда.

Я использую C++ исключения только в "одноразовых" проектах (особенно удобно для работы с COM), но никогда в production-системах.

Да, приходится постоянно писать if(FAILED(hr)), это минус.
Зато уже при написании следующей строчки приходится думать, что же надо в этом случае делать: какие ресурсы освобождать, надо ли извещать пользователя и если надо то как, что писать в лог, или может просто вернуть код ошибки выше и обрабатывать его там, и т.п. И вот решение подобных вопросов очень полезно и для качества кода, для качества продукта.

R>Не говоря уже о том, что в Java/C# такой подход вообще не будет работать, т.к. потенциально практически каждая строчка кода бросает исключения.

В этом форуме речь про C++, большая часть людей использует C++ шоб писать native code. В Java/C# пускай бросают (всё равно приходится ловить и обрабатывать исключения брошенные соответственно JRE/.NET), сам в обоих языках и бросал, и ловил.
Re[7]: Google C++ Style Guide
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.07.08 15:50
Оценка:
Здравствуйте, Константин, Вы писали:

К>Я использую C++ исключения только в "одноразовых" проектах (особенно удобно для работы с COM), но никогда в production-системах.


А в свободное от работы время пишете фельетоны для joelonsoftware?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[19]: Google C++ Style Guide
От: igna Россия  
Дата: 10.07.08 16:28
Оценка:
Здравствуйте, _Jane_, Вы писали:

_J_>Не подскажете, в каких случаях это может пригодиться? Как именно расставляются пробелы и табуляции, систематически?

_J_>Дело в том, что если их расставлять как попало, то кому-то другому, который будет смотреть этот код, придётся временно выставить размер табуляции в тот, который использовался при написании кода, что бывает не удобно.

Правило номер 1: Либо табулятор является первым символом (знаком) в строке, либо ему предшествует другой табулятор.
Правило номер 2: Для выравнивания с текстом нужно использовать пробел (сорри, невнятно, см. пример)

--->if (ok)
--->--->f(x,
--->--->  y);
Re[7]: Google C++ Style Guide
От: crable США  
Дата: 10.07.08 17:14
Оценка:
Здравствуйте, Константин, Вы писали:

К>Здравствуйте, remark, Вы писали:


E>>>Феерический бред.


R>>Полностью поддерживаю. Это похоже на мнение человека, который 10 лет писал на С, а потом увидел исключения, и попытался их использовать как будто это ещё один способ локальной передачи управления, аналогичный while/if/goto.


К>Ты собираешься спорить с тем что исключения это ещё один способ передачи управления? Только у while/if и прочих есть скобочки и их видно, а пролетающее мимо исключение ни хрена не видно.


С чего ты взял, что кто-то с этим собирается спорить?

К>У goto и исключений много общего. Обоих не видно читая код, и оба отнюдь не локальная передача управления, а вполне себе глобальная. Именно из-за этих свойств goto не рекомендуется к использованию. Исключения некоторые рекомендуют, хотя от goto они отличаются только тем шо аккуратнее обходятся с данными на стеке (зовёт деструкторы), и ещё тем шо переход выполняется не на метку а Х3 куда.


goto передает управление в рамках одной функции, с каких это пор он стал глобальным? Ты, кстати, очень верно подметил важное отличие исключений от goto. Для goto нужно указывать куда происходит переход, а для исключений место... ммм... "перехода" определяется внешним кодом, а не тем который кидает исключение. Т.о. коду, в котором произошла исключительная ситуация не нужно ничего знать о том кто, как и где эту исключительную ситуацию обработает. По сути, это применение принципа сокрытия информации, описанного еще в 70-х годах в работах Парнаса, к обработке ошибок.

К>Я использую C++ исключения только в "одноразовых" проектах (особенно удобно для работы с COM), но никогда в production-системах.


К>Да, приходится постоянно писать if(FAILED(hr)), это минус.

К>Зато уже при написании следующей строчки приходится думать, что же надо в этом случае делать: какие ресурсы освобождать, надо ли извещать пользователя и если надо то как, что писать в лог, или может просто вернуть код ошибки выше и обрабатывать его там, и т.п. И вот решение подобных вопросов очень полезно и для качества кода, для качества продукта.

Согласен, решение этих вопросов очень важно для качества продукта, только как их решению способствует отказ от исключений?

R>>Не говоря уже о том, что в Java/C# такой подход вообще не будет работать, т.к. потенциально практически каждая строчка кода бросает исключения.

К>В этом форуме речь про C++, большая часть людей использует C++ шоб писать native code. В Java/C# пускай бросают (всё равно приходится ловить и обрабатывать исключения брошенные соответственно JRE/.NET), сам в обоих языках и бросал, и ловил.

А причем тут native или не-native код? Почему в Java и C# кидать исключения нормально, а в С++ это уже плохо??? При чем тут исключения JRE/.NET??? Где во всех твоих предыдущих аргументах против исключений используются особенности C++?
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[22]: Google C++ Style Guide
От: Аноним  
Дата: 11.07.08 07:46
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Задача. Добавить элемент в два хранилища. Обе операции добавления могут завершиться неудачей. Обеспечить строгую гарантию.


RO>Вариант. То же для N хранилищ.


можно увидеть решение?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.