powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / goto address
25 сообщений из 621, страница 1 из 25
goto address
    #39484089
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли как нибудь узнать адрес - указывающий на goto label ??? Должна же быть какая - то магия

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

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

if (n >= 0 && n <=2)
    goto *s[n];
...
Рейтинг: 0 / 0
goto address
    #39484109
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,
Код: 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
goto address
    #39484120
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

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

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


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


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


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


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

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

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


...

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

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

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

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

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

Исходная функция
Код: 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
goto address
    #39484171
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем тебе массив процедур не канает?
...
Рейтинг: 0 / 0
goto address
    #39484172
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatА чем тебе массив процедур не канает?

Вызов процедуры стоит дороже чем case. Порядком на 2 секунды. А вот тот код с гцц и дольше 1 то не работает.. Точнее 0,6
...
Рейтинг: 0 / 0
goto address
    #39484173
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в Токио завезли настоящий 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
goto address
    #39484182
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ещё один "великий оптимизатор"
...
Рейтинг: 0 / 0
goto address
    #39484208
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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


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

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

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


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