Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / goto address / 25 сообщений из 621, страница 1 из 25
06.07.2017, 19:27:14
    #39484089
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Можно ли как нибудь узнать адрес - указывающий на goto label ??? Должна же быть какая - то магия

(Не стоит переубеждать не использовать goto)
...
Рейтинг: 0 / 0
06.07.2017, 19:34:31
    #39484092
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Кстати, на Си под GCC было решение такое

Код: plaintext
1.
2.
3.
4.
void *s[3] = {&&s0, &&s1, &&s2};

if (n >= 0 && n <=2)
    goto *s[n];
...
Рейтинг: 0 / 0
06.07.2017, 20:41:39
    #39484109
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Няшик,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
label
 &label;
var
 Labela : Cardinal;
begin
&label:
asm
 lea eax,label;
 mov Labela,eax
end;
 Caption := IntToHex(Labela, 8);
end;
...
Рейтинг: 0 / 0
06.07.2017, 21:18:29
    #39484120
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Няшик,

В рамках языка никак. Надо либо вручную отсчитывать смещение внутри функции, либо делать как показал товарищ выше

Может быть твою задачу можно решить как-то цивилизованно
...
Рейтинг: 0 / 0
06.07.2017, 21:27:46
    #39484121
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
SOFT FOR YOUНяшик,
В рамках языка никак.


А было бы замечательно, что бы компилятор сам вставлял адреса. Это было - бы очень полезно! Чем всякий там case полоумный


SOFT FOR YOUНадо либо вручную отсчитывать смещение внутри функции


Думал о таком.. Но если на 64 компиляторе собирать, значения же сместятся ? По адресу


SOFT FOR YOUМожет быть твою задачу можно решить как-то цивилизованно

Так на GCC это вполне цивилизованно. И на оптимизации найс ... Просто достать индекс из массива, и прыгнуть к нужному коду

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html


...

А насчёт выше, я знал заранее - но интересовала автоматика
...
Рейтинг: 0 / 0
06.07.2017, 23:47:52
    #39484154
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Няшик,

У меня возникает ощущение, что ты городишь какую-то фигню, которая на раз-два решается стандартными средствами языка
...
Рейтинг: 0 / 0
07.07.2017, 02:41:16
    #39484169
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
SOFT FOR YOUНяшик,

У меня возникает ощущение, что ты городишь какую-то фигню, которая на раз-два решается стандартными средствами языка

=_= Да кэп, решается ! На раз два три. А теперь думается как бы всё дело поторопить до сверх скорости.

На гцц эта шняга обгоняет на 99% всё что можно написать на паскале и c++ билдере
...
Рейтинг: 0 / 0
07.07.2017, 02:55:49
    #39484170
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Вот пример того, что генерит ГЦЦ

Исходная функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  int Test(int Value, int c) {

	static void *array[] = {
		&&s1, && s2, && s3, && s4, && s5, && s6, && s7, && s8, && s9, && s10,
		&& s11, && s12, && s13, && s14, && s15};

	goto *(array[c]);

s3:
	return 1;
s4:
	return 2;
s5:
	return 3;
s6:
	return 4;
s7:
	return 5;
s8:
	return 6;
s9:
	return 7;
s10:
	return 8;
s11:
	return 9;
s12:
	return 10;
s13:
	return 11;
s14:
	return 12;
s15:
	return 13;
s1:
s2:
return 0;
}



А вот результат
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Test(int, int):
        mov     eax, DWORD PTR [esp+8]
        jmp     [DWORD PTR Test(int, int)::array[0+eax*4]]
.L16:
.L17:
        xor     eax, eax
        ret
.L2:
        mov     eax, 1
        ret
.L4:
        mov     eax, 2
        ret
.L5:
        mov     eax, 3
        ret
.L6:
        mov     eax, 4
        ret
.L7:
        mov     eax, 5
        ret
.L8:
        mov     eax, 6
        ret
.L9:
        mov     eax, 7
        ret
.L10:
        mov     eax, 8
        ret
.L11:
        mov     eax, 9
        ret
.L12:
        mov     eax, 10
        ret
.L13:
        mov     eax, 11
        ret
.L14:
        mov     eax, 12
        ret
.L15:
        mov     eax, 13
        ret
Test(int, int)::array:
        .long   .L16
        .long   .L17
        .long   .L2
        .long   .L4
        .long   .L5
        .long   .L6
        .long   .L7
        .long   .L8
        .long   .L9
        .long   .L10
        .long   .L11
        .long   .L12
        .long   .L13
        .long   .L14
        .long   .L15



На деле это всё очень быстро работает. Быстрее всяких if - case (switch)
...
Рейтинг: 0 / 0
07.07.2017, 03:35:54
    #39484171
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
А чем тебе массив процедур не канает?
...
Рейтинг: 0 / 0
07.07.2017, 03:41:40
    #39484172
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
rgreatА чем тебе массив процедур не канает?

Вызов процедуры стоит дороже чем case. Порядком на 2 секунды. А вот тот код с гцц и дольше 1 то не работает.. Точнее 0,6
...
Рейтинг: 0 / 0
07.07.2017, 04:19:31
    #39484173
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Кстати, в Токио завезли настоящий clang ? Или он по прежнему не сможет скомпилировать код ниже ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  int Test(int Value, int c) {

	static void *array[] = {
		&&s1, && s2, && s3, && s4, && s5, && s6, && s7, && s8, && s9, && s10,
		&& s11, && s12, && s13, && s14, && s15};

	goto *(array[c]);

s3:
	return 1;
s4:
	return 2;
s5:
	return 3;
s6:
	return 4;
s7:
	return 5;
s8:
	return 6;
s9:
	return 7;
s10:
	return 8;
s11:
	return 9;
s12:
	return 10;
s13:
	return 11;
s14:
	return 12;
s15:
	return 13;
s1:
s2:
return 0;
}




Есть идея, просто напросто перейти на билдер, и там продолжить
...
Рейтинг: 0 / 0
07.07.2017, 07:16:12
    #39484182
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
ещё один "великий оптимизатор"
...
Рейтинг: 0 / 0
07.07.2017, 08:42:42
    #39484208
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Няшик,

Спорим на бутылку пива, что на Delphi я напишу функцию, повторяющую функционал, но работающую в разы быстрее GCC-реализации?

Может перестанешь маяться фигней? Что задача там у тебя
...
Рейтинг: 0 / 0
07.07.2017, 08:43:30
    #39484209
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
defecator,

Лучше быть начинающим великим оптимизатором, чем законченным нубом в них )
...
Рейтинг: 0 / 0
07.07.2017, 08:45:51
    #39484210
jmp_original
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
НяшикВызов процедуры стоит дороже чем case. Порядком на 2 секунды.
Сколько миллиардов вызовов было сделано?
...
Рейтинг: 0 / 0
07.07.2017, 09:01:15
    #39484216
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
SOFT FOR YOUНяшик,

Спорим на бутылку пива, что на Delphi я напишу функцию, повторяющую функционал, но работающую в разы быстрее GCC-реализации?

Может перестанешь маяться фигней? Что задача там у тебяНу дык он уже привел функцию. Напишешь "в разы быстрее"?
...
Рейтинг: 0 / 0
07.07.2017, 09:27:46
    #39484231
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
white_nigger,

За бутылку пива я и не такое напишу ))
...
Рейтинг: 0 / 0
07.07.2017, 09:52:39
    #39484254
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
SOFT FOR YOUНяшик,

Спорим на бутылку пива, что на Delphi я напишу функцию, повторяющую функционал, но работающую в разы быстрее GCC-реализации?

Может перестанешь маяться фигней? Что задача там у тебя

Даг это не фигня Никакая вовсе. Вряд - ли напишешь... Так как там в ГЦЦ обычный jmp от array к адресу ... Без всяких call и.т.д.


jmp_originalНяшикВызов процедуры стоит дороже чем case. Порядком на 2 секунды.
Сколько миллиардов вызовов было сделано?

1000000000
...
Рейтинг: 0 / 0
07.07.2017, 09:57:06
    #39484257
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Няшик,

Так спорим или нет?
...
Рейтинг: 0 / 0
07.07.2017, 10:01:02
    #39484260
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
НяшикМожно ли как нибудь узнать адрес - указывающий на goto label ??? Должна же быть какая - то магия

(Не стоит переубеждать не использовать goto)

Хотелось бы все же знать, зачем потребовался массив меток.

Не в плане переубеждения, а в плане понимания и поиска подходящего решения )
...
Рейтинг: 0 / 0
07.07.2017, 10:11:10
    #39484273
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
SOFT FOR YOUНяшик,

Так спорим или нет?

Почему бы и нет? Только без всяких asm


Aleksandr SharahovНяшикМожно ли как нибудь узнать адрес - указывающий на goto label ??? Должна же быть какая - то магия

(Не стоит переубеждать не использовать goto)

Хотелось бы все же знать, зачем потребовался массив меток.

Не в плане переубеждения, а в плане понимания и поиска подходящего решения )


Что бы быстро прыгать к месту, а не тратить время на реализацию case и if ... Которые на 99% медленнее чем просто прыгнуть по адресу
...
Рейтинг: 0 / 0
07.07.2017, 10:14:36
    #39484278
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
НяшикЧто бы быстро прыгать к месту, а не тратить время на реализацию case и if ... Которые на 99% медленнее чем просто прыгнуть по адресу

Это не ответ. Пример нужен.
...
Рейтинг: 0 / 0
07.07.2017, 10:23:47
    #39484283
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
Aleksandr SharahovНяшикЧто бы быстро прыгать к месту, а не тратить время на реализацию case и if ... Которые на 99% медленнее чем просто прыгнуть по адресу

Это не ответ. Пример нужен.

А по моему ответ. Просто функция будет не один миллион раз вызываться с нужным функционалом. По этому хотелось бы не видеть просадов... Гцц всё таки ведь за 0.6 сек это делал, вместо 4 на дельфи с case
...
Рейтинг: 0 / 0
07.07.2017, 10:31:19
    #39484287
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
НяшикAleksandr Sharahovпропущено...


Это не ответ. Пример нужен.

А по моему ответ. Просто функция будет не один миллион раз вызываться с нужным функционалом. По этому хотелось бы не видеть просадов... Гцц всё таки ведь за 0.6 сек это делал, вместо 4 на дельфи с case
ну а дальше шитый код пойдём изучать :-)
...
Рейтинг: 0 / 0
07.07.2017, 10:36:33
    #39484291
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
goto address
НяшикА по моему ответ. Просто функция будет не один миллион раз вызываться с нужным функционалом. По этому хотелось бы не видеть просадов... Гцц всё таки ведь за 0.6 сек это делал, вместо 4 на дельфи с case

Так никто не против. Хоть 100 мильенов. Если тебе не надо быстрее 0.6 сек, можешь не отвечать )
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / goto address / 25 сообщений из 621, страница 1 из 25
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]