Войти
ФлеймФорумОбщее

Шейдеры 4.0 как сделать goto в шейдерах? (4 стр)

Страницы: 1 2 3 4
#45
13:09, 12 апр. 2012

Suslik

Ну, вместо

goto всё_плохо;

имеет смысл использовать

try { ... } finally { ... }

Хотя, стойте... Ведь в С++ нет finally! :) А если серьёзно, то в Microsoft C++ есть замена:

__try { ... } __finally { ... }

2All

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


#46
14:33, 12 апр. 2012

RPGman
> Выпрыгнуть из нескольких вложенных циклов, например. В Java и то есть
> break/continue label.
что мешает сделать так:

bool gt = false;
for (int x = 0;  !gt && x < 100; x++)
  for (int y = 0; !gt && y < 100; y++)
    if (x == 50 && y == 50)
      gt = true;
Выходим сразу из обоих. Также можно для трех,четырех, десяти. Намного удобней чем гото.
#47
15:09, 12 апр. 2012

war_zes
> что мешает сделать так:

Лишняя проверка на каждой итерации

#48
15:14, 12 апр. 2012

war_zes
> что мешает сделать так:
Очевидный говностайл.
ИМХО такая конструкция - единственное оправдание ГоТо.

#49
15:23, 12 апр. 2012

Любой код на вложенных if-ах можно переписать на goto без вложенностей.

#50
15:29, 12 апр. 2012

где шейдера то ?

#51
15:29, 12 апр. 2012

TarasB
> Лишняя проверка на каждой итерации
ты так говоришь, будто драйвер пишешь. То что при этом еще и x|y < 100 каждую итерацию проверяется это ниче?


-Eugene-
> Очевидный говностайл.
> ИМХО такая конструкция - единственное оправдание ГоТо.
не вижу говностайла из-за которого лучше использовать гото. Ведь вторая часть цикла для того и нужна чтобы сделать проверку (и не важно что проверяем - x < 100, x != end() или вот такая вот запись)

#52
15:44, 12 апр. 2012

war_zes
Вообще и то, и то - говнокод, а тут уже спор о сортах говна получается.
С++-у крайне не хватает команды break(N)

#53
16:05, 12 апр. 2012

-Eugene-
> С++-у крайне не хватает команды break(N)
return

#54
16:11, 12 апр. 2012

Хорошо, а как бы вы написали функцию, которая вначале захватывает некоторое кол-во ресурсов, что-то с ними делает, внутри есть проверка ошибок, несколько сценариев в середине функции могут остановить выполнение и вернуть код ошибки, при этом ресурсы надо освободить. Писать в каждом if'е освобождение - парит. Выносить освобождение ресурсов в отдельную функцию - и неудобно и уродует код. goto в конец функции с освобождением ресурсов - не самый плохой вариант. Причём несколько раз данный подход виделся мной и в продакшн-коде.

#55
16:12, 12 апр. 2012

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

#define exitloop(label) goto label

Cerber
> return
Ну да, выходить из вложенных циклов — это мэйнстрим, сейчас модно сразу из процедуры выходить!

Necrys
Вообще говоря — такой подход имеет право на жизнь. Однако, если код пишется для компилятора от Microsoft, то имеет смысл использовать их расширение

__try { ... } __finally { ... }
Конечно же, это если речь идёт о С++, а не о С.
Правка: с другой стороны, не стоит забывать об используемом в С++ подходе, именуемом Resource Acquisition Is Initialization (RAII). Реализация этого подхода стала причиной невключения в С++ оператора finally. Можно почитать хорошее разъяснение здесь.

2all
Вот, кстати, по теме можно почитать Structured Programming with goto Statements за авторством Дональда Кнута.

#56
16:20, 12 апр. 2012

Necrys
> Хорошо, а как бы вы написали функцию, которая вначале захватывает некоторое
> кол-во ресурсов, что-то с ними делает, внутри есть проверка ошибок, несколько
> сценариев в середине функции могут остановить выполнение и вернуть код ошибки,
> при этом ресурсы надо освободить. Писать в каждом if'е освобождение - парит.
> Выносить освобождение ресурсов в отдельную функцию - и неудобно и уродует код.
> goto в конец функции с освобождением ресурсов - не самый плохой вариант. Причём
> несколько раз данный подход виделся мной и в продакшн-коде.

1. try-finally
2. Создам объект, освобождающий ресурс в автодеструкторе.
3. Scope Exit

#57
16:41, 12 апр. 2012

TarasB
> 1. try-finally
Часто - не вариант, проекты без эксепшенов, совсем. Ибо производительность. Там где не критично - да, можно.

> 2. Создам объект, освобождающий ресурс в автодеструкторе.
Лишний код. Решение с goto выглядит изящнее. Нам не за кол-во строк кода платят.

> 3. Scope Exit
Ну считай тоже что и п.2, писать под каждый случай обёртку не хочется.

#58
16:50, 12 апр. 2012

Necrys
> Часто - не вариант, проекты без эксепшенов, совсем. Ибо производительность. Там
> где не критично - да, можно.

Оно и без исключений отлично работает. Насчёт производительности: тормозить будет только инициализация длинного перехода.

Necrys
> Лишний код.

Нет. Обёртка над ресурсом пишется один раз, используется дофига, кода в итоге меньше.

Necrys
> Ну считай тоже что и п.2

Нет, не то же. Ты просто прямо на месте пишешь, что надо делать при выходе из процедуры. Не в конце, а прямо на месте, при этом без гото. Снова кода получается меньше.

Страницы: 1 2 3 4
ФлеймФорумОбщее

Тема в архиве.