Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 .. 25   вперед  Ctrl
 goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Можно ли как нибудь узнать адрес - указывающий на goto label ??? Должна же быть какая - то магия

(Не стоит переубеждать не использовать goto)
6 июл 17, 19:27    [20620760]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Кстати, на Си под GCC было решение такое

void *s[3] = {&&s0, &&s1, &&s2};

if (n >= 0 && n <=2)
    goto *s[n];
6 июл 17, 19:34    [20620773]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Bred eFeM
Member

Откуда:
Сообщений: 519
Няшик,
label
 &label;
var
 Labela : Cardinal;
begin
&label:
asm
 lea eax,label;
 mov Labela,eax
end;
 Caption := IntToHex(Labela, 8);
end;
6 июл 17, 20:41    [20620882]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
Няшик,

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

Может быть твою задачу можно решить как-то цивилизованно
6 июл 17, 21:18    [20620960]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
SOFT FOR YOU
Няшик,
В рамках языка никак.


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


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


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


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


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

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


...

А насчёт выше, я знал заранее - но интересовала автоматика
6 июл 17, 21:27    [20620991]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
Няшик,

У меня возникает ощущение, что ты городишь какую-то фигню, которая на раз-два решается стандартными средствами языка
6 июл 17, 23:47    [20621178]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
SOFT FOR YOU
Няшик,

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


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

На гцц эта шняга обгоняет на 99% всё что можно написать на паскале и c++ билдере
7 июл 17, 02:41    [20621267]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Вот пример того, что генерит ГЦЦ

Исходная функция
+
  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;
}


А вот результат
+
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)
7 июл 17, 02:55    [20621269]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
rgreat
Member

Откуда:
Сообщений: 3747
А чем тебе массив процедур не канает?
7 июл 17, 03:35    [20621271]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
rgreat
А чем тебе массив процедур не канает?


Вызов процедуры стоит дороже чем case. Порядком на 2 секунды. А вот тот код с гцц и дольше 1 то не работает.. Точнее 0,6
7 июл 17, 03:41    [20621273]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Кстати, в Токио завезли настоящий clang ? Или он по прежнему не сможет скомпилировать код ниже ?

+
  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;
}



Есть идея, просто напросто перейти на билдер, и там продолжить
7 июл 17, 04:19    [20621280]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
defecator
Member

Откуда:
Сообщений: 35505
ещё один "великий оптимизатор" Картинка с другого сайта.
7 июл 17, 07:16    [20621338]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
Няшик,

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

Может перестанешь маяться фигней? Что задача там у тебя
7 июл 17, 08:42    [20621430]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
defecator,

Лучше быть начинающим великим оптимизатором, чем законченным нубом в них )
7 июл 17, 08:43    [20621433]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
jmp_original
Guest
Няшик
Вызов процедуры стоит дороже чем case. Порядком на 2 секунды.

Сколько миллиардов вызовов было сделано?
7 июл 17, 08:45    [20621440]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1631
SOFT FOR YOU
Няшик,

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

Может перестанешь маяться фигней? Что задача там у тебя
Ну дык он уже привел функцию. Напишешь "в разы быстрее"?
7 июл 17, 09:01    [20621474]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
white_nigger,

За бутылку пива я и не такое напишу ))
7 июл 17, 09:27    [20621541]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
SOFT FOR YOU
Няшик,

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

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


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


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

Сколько миллиардов вызовов было сделано?


1000000000
7 июл 17, 09:52    [20621654]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
Няшик,

Так спорим или нет?
7 июл 17, 09:57    [20621674]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Aleksandr Sharahov
Member

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

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


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

Не в плане переубеждения, а в плане понимания и поиска подходящего решения )
7 июл 17, 10:01    [20621690]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
SOFT FOR YOU
Няшик,

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


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


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

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


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

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



Что бы быстро прыгать к месту, а не тратить время на реализацию case и if ... Которые на 99% медленнее чем просто прыгнуть по адресу
7 июл 17, 10:11    [20621743]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1361
Няшик
Что бы быстро прыгать к месту, а не тратить время на реализацию case и if ... Которые на 99% медленнее чем просто прыгнуть по адресу


Это не ответ. Пример нужен.
7 июл 17, 10:14    [20621761]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Aleksandr Sharahov
Няшик
Что бы быстро прыгать к месту, а не тратить время на реализацию case и if ... Которые на 99% медленнее чем просто прыгнуть по адресу


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


А по моему ответ. Просто функция будет не один миллион раз вызываться с нужным функционалом. По этому хотелось бы не видеть просадов... Гцц всё таки ведь за 0.6 сек это делал, вместо 4 на дельфи с case
7 июл 17, 10:23    [20621828]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2412
Няшик
Aleksandr Sharahov
пропущено...


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


А по моему ответ. Просто функция будет не один миллион раз вызываться с нужным функционалом. По этому хотелось бы не видеть просадов... Гцц всё таки ведь за 0.6 сек это делал, вместо 4 на дельфи с case

ну а дальше шитый код пойдём изучать :-)
7 июл 17, 10:31    [20621872]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1361
Няшик
А по моему ответ. Просто функция будет не один миллион раз вызываться с нужным функционалом. По этому хотелось бы не видеть просадов... Гцц всё таки ведь за 0.6 сек это делал, вместо 4 на дельфи с case


Так никто не против. Хоть 100 мильенов. Если тебе не надо быстрее 0.6 сек, можешь не отвечать )
7 июл 17, 10:36    [20621905]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 .. 25   вперед  Ctrl
Все форумы / Delphi Ответить