Здравствуйте, niXman, Вы писали:
X>Здравствуйте, enji, Вы писали:
E>> HashMap map(SingleObjectDeleter);
E>> // Constructs a %HashMap instance with default capacity, load factor, hash code provider, and comparer E>> map.Construct();
E>> map.Add(new String(L"Zero"), new Integer(0)); // map.GetCount() : 1, map : (Zero -> 0) E>> map.Add(new String(L"One"), new Integer(1)); // map.GetCount() : 2, map : (Zero -> 0), (one -> 1) E>> map.Add(new String(L"Two"), new Integer(2)); // map.GetCount() : 3, map : (Zero -> 0), (one -> 1), (Two -> 2) X>так это что же получается, у них и шаблонов нет и смарт указателей тожа? оО X>
Там у контейнеров идеология явовская, как я понимаю. Есть интерфейсы, от них наследуются конкретные контейнеры. В результате можно без шаблонов использовать контейнеры неизвестного типа, но зато они становятся неоднородными (или как это правильно называется) — можно запихать int, попытаться прочитать строку и после static_cast словить массу интересного
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Kernan, Вы писали:
K>>Есть там всё. X>т.е. это писатели экзампла об этом незнают?
Как видишь. X>зы X>вообще страшно от того, что эти же писатели экзампла, могли кодить не только экзамплы %)
Ядро, ЕМНИП, там вполне неплохо сделано.
Здравствуйте, enji, Вы писали:
E>Там у контейнеров идеология явовская, как я понимаю. Есть интерфейсы, от них наследуются конкретные контейнеры. В результате можно без шаблонов использовать контейнеры неизвестного типа, но зато они становятся неоднородными (или как это правильно называется) — можно запихать int, попытаться прочитать строку и после static_cast словить массу интересного
как ты туда запихнешь int, если контейнер без шаблонов параметром Object* принимает??
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, enji, Вы писали:
E>>(или как это правильно называется) X>гетерогенные?
X>на яве я не писатель, но от описанной тобою идеалогии становится непонятно, почему на фоне ява, с++ считается "опасным" ЯП %)
в джаве невозвожно сделать так
struct Object
{
virtual ~Object() {}
};
struct Integer: Object
{
int value;
Integer(int val) : value(val){}
};
int main()
{
Object * o = new Integer(10);
Integer * i = static_cast<Integer *>(o);
}
закастить предка к потомку можно только с проверкой во время выполнения(через dynamic_cast). то что в плюсах выделенная строчка компилируется — это именно плюсовый касяк. но мне либо dynamic_cast либо reinterpret_cast.
J>int main()
J>{
J> Object * o = new Integer(10);
J> Integer * i = static_cast<Integer *>(o);
J>}
J>
J>закастить предка к потомку можно только с проверкой во время выполнения(через dynamic_cast). то что в плюсах выделенная строчка компилируется — это именно плюсовый касяк.
Это не косяк, а фича — don't pay for what you don't use.
Если ты знаешь тип объекта например по встроенному TypeID, or by any other means (например как в твоём примере выше) — ты можешь не платить за dynamic_cast.
Более того, RTTI не всегда доступен.
J>но мне либо dynamic_cast либо reinterpret_cast
reinterpret_cast это очень low-level механизм, стандартом предоставляются мизерные гарантии по поводу него.
Тебе скорей всего просто не хватает polymorphic_downcast.
The C++ built-in static_cast can be used for efficiently downcasting pointers to polymorphic objects, but provides no error detection for the case where the pointer being cast actually points to the wrong derived class. The polymorphic_downcast template retains the efficiency of static_cast for non-debug compilations, but for debug compilations adds safety via an assert() that a dynamic_cast succeeds.
P.S. Там где есть templates/generics — необходимость в кастах возникает намного реже.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Jack128, Вы писали:
J>>
J>>int main()
J>>{
J>> Object * o = new Integer(10);
J>> Integer * i = static_cast<Integer *>(o);
J>>}
J>>
J>>закастить предка к потомку можно только с проверкой во время выполнения(через dynamic_cast). то что в плюсах выделенная строчка компилируется — это именно плюсовый касяк.
EP>Это не косяк, а фича — don't pay for what you don't use. EP>Если ты знаешь тип объекта например по встроенному TypeID, or by any other means (например как в твоём примере выше) — ты можешь не платить за dynamic_cast. EP>Более того, RTTI не всегда доступен.
J>>но мне либо dynamic_cast либо reinterpret_cast
EP>reinterpret_cast это очень low-level механизм, стандартом предоставляются мизерные гарантии по поводу него.
А, понял в чем мой прокол. Если у нас используется множественное наследование, то как я понимаю reinterpret_cast может не дать корректный результат, даже если по факту аргумент является указателем на Integer. А динамик — дает пенальти в ран тайм. статик_каст — сидит посередине.
Сенкс.
Здравствуйте, MTD, Вы писали:
MTD>Здравствуйте, Ops, Вы писали:
Ops>>Как вариант, хелп спихнули на студентов?
MTD>Судя по коду не только хелп. Пример:
MTD>
MTD>Это же прекрасно, когда метод мапы возвращает объект который надо не забыть удалить!
Самое восхитительое, что про необходимость удаления в документации GetMapEnumeratorN не сказано (или вот эта буква N в конце имени метода говорит об этом?)
Законы Мерфи были сформулированы уже столько поколений назад, а люди и сейчас продолжают строгать API, с которыми накосячить проще, чем сделать всё правильно. Ладно у них нет исключений, но почему из таких методов нельзя возвращать какой-нибудь вариант unique_ptr?
Здравствуйте, enji, Вы писали:
E>Стащил у eao197.
E>Будущее мобильной разработки, Tizen 2.0. По моему, шикарно... 6 new, 3 каста, 1 delete и даже E_SUCCESS
А при чем здесь Tizen? Ваш eao197 просто не в теме. Самсунг как и обещал еще в прошлом году, добавил поддержку апи Бады.
Сравните: здесь tizen
и здесь бада
Здравствуйте, cencio, Вы писали:
C>А при чем здесь Tizen? Ваш eao197 просто не в теме. Самсунг как и обещал еще в прошлом году, добавил поддержку апи Бады. C>Сравните: C>здесь tizen C>и C>здесь бада
я не уверен, что из этого хуже %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
MTD>Это же прекрасно, когда метод мапы возвращает объект который надо не забыть удалить!
Не разбирался, что там к чему, HashMap — тип из какой-нибудь основной библиотеки? Она обязательна для использования (часть фич только через нее, и т.п.)?
Или, может, это костыль для совместимости с чем-то еще, а систему можно дергать совсем по-другому?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, jazzer, Вы писали:
J>В общем, они пошли по пути Симбиана, в котором не было исключений, типа слишком тяжелый механизм для мобильных устройств
Они там были где-то с 2003 года, но интерфейс собственно операционки не переписывали по историческим причинам. ИМХО — это было важной доской гроба.
Здравствуйте, jazzer, Вы писали:
L>>Да двухфазная инициализация — это жесть. Получается, что тебе дали объект, но сказать, можно ли его использовать, забыли. Особенно забавно на этом фоне выглядят конструкторы копирования J>Ну, может, у них есть какой-нть is_initialized()
Ну, тут можно сказать лишь одно — даешь оплату за строчки кода!
Интересно, кто-то наверняка ведь должен был оценить медианный размер кода, в котором макаро оверхед от анализа кодов возврата на каждый чих начинает сводить на нет выгоду от отказа от исключений, которые имеют "footprint and runtime overhead"?
Здравствуйте, landerhigh, Вы писали:
L>Интересно, кто-то наверняка ведь должен был оценить медианный размер кода, в котором макаро оверхед от анализа кодов возврата на каждый чих начинает сводить на нет выгоду от отказа от исключений, которые имеют "footprint and runtime overhead"?
Я слышал, что при happy-path (когда исключения не кидаются) x64 код получается даже быстрее чем аналогичный с "if(err1) goto ERR1;".
Сам тестов не делал — надо что-нибудь запилить назло тем кто ноет про медленные исключения.
Насколько я себе представляю — "вредный" overhead от исключений есть только тогда, когда компилятор предполагает что функция которую он не видит, может кинуть (которая на самом деле ничего не кидает). Но в C++11 уже есть noexcept.
P.S.
My typical reply is also somewhere along the same lines: if you don't like to use exceptions, then just don't use them. Leave that job to the professionals
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Я слышал, что при happy-path (когда исключения не кидаются) x64 код получается даже быстрее чем аналогичный с "if(err1) goto ERR1;". EP>Сам тестов не делал — надо что-нибудь запилить назло тем кто ноет про медленные исключения.
я тестировал оверхед создаваемый SJLJ реализацией исключений в венде(мингв), когда сами исключения не бросаются. т.е. интересен был побочный эффект.
оказалось, 1.4-4.1 процента.
как известно, SJLJ это дорогие исключения. но, как показывает мой тест, я готов платить 5% за то чтоб обрабатывать коды ошибок через каждые пять строк =)
DWARF как и SEH — не создают побочный оверхед. так что, я совершенно не понимаю стоимости аргументации не использовать исключения.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
тьфу %)
X>я готов платить 5% за то чтоб обрабатывать коды ошибок через каждые пять строк =)
я готов платить 5% за то чтоб не обрабатывать коды ошибок через каждые пять строк =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)