> man operating_systems
Центр информации по операционным системам :: Форумы :: Операционные системы :: Другие ОС
 
<< Предыдущая тема | Следующая тема >>
Реально ли сделать простую ОСь своими руками?
Переход на страницу  1 2 3 4 [5] 6 ... 11 12 13
Модераторы: Roman I Khimov, Wanderer, Dron
Автор Добавил
grizlyk
Четверг 09.11.2006 19:45
ID пользователя #757
Зарегистрирован: Понедельник 06.11.2006 22:42
Сообщений: 72
Dron написал(а) ...
Но вот где-то читал, что майкрософт к примеру генерирует код так, что оптимизируется нормальная работа, в ущерб исключительным ситуациям.
Вот и я про то же. Пример привел, сравнивая который видно, что код без условий исключения отличается только размером стека.

Dron написал(а) ...
Возвращать через исключения значения - это изврат.
Я говорил об обратном: возвращать исключения через возврат результата. Но это так, предположение.

Dron написал(а) ...
Правда вот gcc генерирует код более менее сбалансировано, то есть накладные расходы на исключения меньше, но и основные алгоритмы тоже страдают.
Интересно, кто же кроме gcc генерирует такой ассемблер "movl %eax,%edx"? Пример как раз компилирован gcc/gpp с ключами по умолчанию.

Пытаюсь еще разок сделать присоединение файла с примером ...

757_21.zip
Наверх
alman
Пятница 10.11.2006 02:01

ID пользователя #753
Зарегистрирован: Суббота 28.10.2006 01:21
Местонахождение: планета Земля
Сообщений: 95
на С/С++ без исклчений и многоэтажных if можно писать так:


<div class='codec'>int do_some()
{

do {
...
if( ... )
{
result = -1;
break
}
...
if( ... )
{
result = -2;
break
}
...
if( ... )
{
result = -3;
break
}

result = 0;

} while(false);

return resultl

}</div><span class='smallblacktext'>[ Редактирование пятница 10.11.2006 02:04 ]</span>
Наверх
Сайт
grizlyk
Среда 15.11.2006 05:57
ID пользователя #757
Зарегистрирован: Понедельник 06.11.2006 22:42
Сообщений: 72
grizlyk написал(а) ...
Куда делся сайт с С-- я не знаю.
О волке речь, а он навстречь - нашлась ссылка на С--
Наверх
Dron
Среда 15.11.2006 09:57


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
alman написал(а) ...
на С/С++ без исклчений и многоэтажных if можно писать так:

int do_some() 
{

  do {
    ...
    if( ... )
    {
      result = -1;
      break
    }
     ...
    if( ... )
    {
      result = -2;
      break
    }
     ...
    if( ... )
    {
      result = -3;
      break
    }

     result = 0;

  } while(false);

  return resultl

}



Ужос! можно конечно и так писать, но лучше убить себя ап стену.


int do_some() 
{
    if( ... )
        return -1;

    if( ... )
        return -2;

    if( ... )
        return -3;

  return 0;
}


[ Редактирование среда 15.11.2006 09:58 ]

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
Roman I Khimov
Среда 15.11.2006 10:47

ID пользователя #1
Зарегистрирован: Воскресенье 27.06.2004 12:37
Местонахождение: Санкт-Петербург
Сообщений: 601
Dron написал(а) ...
Ужос! можно конечно и так писать, но лучше убить себя ап стену.

Мне тут вспоминается старое Linux'овое... (Кстати, Андрей, так как у тебя вышло, получится не всегда, поскольку если ты успел занять какие-то ресурсы, но не смог получить другие, то уже занятое надо освободить, а не просто вываливаться в return...)

... drivers/usb/net/rtl8150.c, в сокращенном виде ...
static int rtl8150_probe(struct usb_interface *intf,
                         const struct usb_device_id *id)
{
...
        if (!alloc_all_urbs(dev)) {
                err("out of memory");
                goto out;
        }
        if (!rtl8150_reset(dev)) {
                err("couldn't reset the device");
                goto out1;
        }
        fill_skb_pool(dev);
        set_ethernet_addr(dev);

        usb_set_intfdata(intf, dev);
        SET_NETDEV_DEV(netdev, &intf->dev);
        if (register_netdev(netdev) != 0) {
                err("couldn't register the device");
                goto out2;
        }

        info("%s: rtl8150 is detected", netdev->name);

        return 0;

out2:
        usb_set_intfdata(intf, NULL);
        free_skb_pool(dev);
out1:
        free_all_urbs(dev);
out:
        kfree(dev->intr_buff);
        free_netdev(netdev);
        return -EIO;
}

Идея тривиальна — для обработки ошибок создается блок в конце функции с аккуратно расставлеными метками, в случае ошибки делается goto на соответствующую метку и освобождаются занятые до ошибки ресурсы. Такие конструкции используются в ядре повсеместно.
Dron написал(а) ...
Одну из двух вечных российских проблем можно, в принципе, решить с помощю

Кстати, у тебя баг в подписи.


Греби и улыбайся!
Наверх
Сайт
Dron
Среда 15.11.2006 12:13


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
За goto - вооще убил бы...

В любом случае остается еще такой, красивый и компактный путь

alloc ();

do_somthing();

free();

Который прекрасно обходится без всяких goto

Хотя если учесть, что освобождается память только в случае сбоя - то такой путь:

alloc ()
if (success) {
...
return;
}

free();

Вообще весь гнутый софт написан довольно таки ужасненько.

ЗЫ: Багу в подписи пофиксил, спасибо.
[ Редактирование среда 15.11.2006 12:14 ]

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
Roman I Khimov
Среда 15.11.2006 16:44

ID пользователя #1
Зарегистрирован: Воскресенье 27.06.2004 12:37
Местонахождение: Санкт-Петербург
Сообщений: 601
Dron написал(а) ...
За goto - вооще убил бы...

Об этом многое сказано, не спорю, но здесь его аккуратное применение позволяет реально упростить код.

Dron написал(а) ...
В любом случае остается еще такой, красивый и компактный путь

alloc ();

do_somthing();

free();

Который прекрасно обходится без всяких goto

Хотя если учесть, что освобождается память только в случае сбоя - то такой путь:

alloc ()
if (success) {
...
return;
}

free();

Как будет работать первое? Как скоро вложенные if'ы перестанут помещаться на экран во втором случае? Случай, повторюсь, предусматривает взятие множества ресурсов, необходимых для работы. В общем случае где-то так:

if (!take_resource1())
        goto out_r1;
if (!take_resource2())
        goto out_r2;
if (!take_resource3())
        goto out_r3;
if (!take_resource4())
        goto out_r4;
...
return 0;
out_r4:
        release_resource3();
out_r3:
        release_resource2();
out_r2:
        release_resource1();
out_r1:
        return -ESMTHBADHAPPEND;


Dron написал(а) ...
Вообще весь гнутый софт написан довольно таки ужасненько.

Как показывает практика, проприетарный софт пишется еще хуже...


Греби и улыбайся!
Наверх
Сайт
Dron
Среда 15.11.2006 17:21


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Если множество if'ов не влезает на экран - то стоит подумать о том чтобы не пытаться все запихнуть в одну функцию.

Вообще функци более 50 строк - вредны. Да это прописные интины.

Да, проприетарный софт бывает ужасен.
Ну что касается лично меня, мне не стыдно показать написанный мною код. Правда он засекречен

PS: кстати при таком подходе, который ты описал - там и эксепшины мало чем помогут, код станет еще ужаснее. Так что это ошибка не в этом месте... где-то в генах...
[ Редактирование среда 15.11.2006 17:22 ]

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
Freeman
Среда 15.11.2006 17:23
ID пользователя #3
Зарегистрирован: Четверг 01.07.2004 14:57
Сообщений: 207
Roman I Khimov написал(а) ...
Как скоро вложенные if'ы перестанут помещаться на экран во втором случае?

Вы что, издеваетесь? "Освобождение узников оператора IF". Буквально вчера нарыл.
Наверх
Roman I Khimov
Среда 15.11.2006 20:25

ID пользователя #1
Зарегистрирован: Воскресенье 27.06.2004 12:37
Местонахождение: Санкт-Петербург
Сообщений: 601
Dron написал(а) ...
Если множество if'ов не влезает на экран - то стоит подумать о том чтобы не пытаться все запихнуть в одну функцию.

Да все бы здорово, но схватить 3-4 ресурса за один присест — нормальное дело, а разделять захват по функциями не получится, поскольку если не получится захватить некий n-ный ресурс, надо освободить все предыдущие n-1. Можно, конечно, поизвращаться, но результат получится значительно хуже, нежели аккуратное применение goto.

Freeman написал(а) ...
Вы что, издеваетесь?

Конечно.

Freeman написал(а) ...
"Освобождение узников оператора IF". Буквально вчера нарыл.

Статья, конечно, сама по себе довольно забавна, но она тут не помогает.

На верхнем уровне здесь полный порядок, Linux ничего не знает про конкретные драйверы, он просто посмотрит на PCI ID или USB device ID, смотрит, какие драйверы резервируют эти ID под себя и, ежели нашелся какой-нибудь, который хочет устройством владеть, вызывает его инициализирующую функцию, передавая в качестве параметра какую-нибудь структурку, актуальную для данной шины. Шины в Linux вообще хорошо сделаны. Проблема возникает уже в самом драйвере - ему нужны какие-то ресурсы, какие знает только сам драйвер, он их, соответственно, и пытается для себя забрать. Однако, если что-то где-то почему-то у него не получится, все занятое он должен освободить и сказать Linux'у "звыняй, но не получится у меня штуковиной сей порулить". 90 с лишним процентов применения goto в Linux именно на это, пожалуй, и уходит.


Греби и улыбайся!
Наверх
Сайт
Переход на страницу  1 2 3 4 [5] 6 ... 11 12 13  

Перейти:     Наверх

Транслировать сообщения этой темы: rss 0.92 Транслировать сообщения этой темы: rss 2.0 Транслировать сообщения этой темы: RDF
Powered by e107 Forum System

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.