LINUX.ORG.RU

Смарите какой шик. :)

 , ,


0

1

Захотелось мне проверить, будет ли вызываться memcmp() для невыровненных адресов. Или может оно там какой-нибудь instrinsic впаяет. Сижу ржу:

https://godbolt.org/z/6dWbP687e

Первый раз tail call optimization на сях-плюсях вижу, и как-то не задумывался, что оно не только к рекурсии применимо.

★★★★★

Первый раз tail call optimization на сях-плюсях вижу, и как-то не задумывался, что оно не только к рекурсии применимо.

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

разумеется рекурсия попадает под это правило.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Всё так. Просто прикольно. :) Ну разве что мне мечталось, что оно какой-нить хитрый intrinsic туда впилит. Понятно что memcmp – не memcpy и не сравнение на равенство, так что сбыча мечт была маловероятна, но мало ли – я ж хз какие там команды в расширенных наборах.

dimgel ★★★★★
() автор топика
Последнее исправление: dimgel (всего исправлений: 3)
Ответ на: комментарий от utanho

надо стараца.

когда вошли в функцию g на стеке был адрес возврата, а параметры в регистрах. вызывается функция memcmp, которая примет эти же параметры в этих же регистрах. поэтому параметры никуда не перекладываются.

а поскольку вызов хвостовой, memcmp можно не вызывать, а сделать туда просто jump. то есть продолжить текущую функцию кодом memcmp. и memcmp ввернется по адресу возврата для g.

это как бы слепили код данной функции и memcmp.

alysnix ★★★
()
Ответ на: комментарий от alysnix

вызывается функция memcmp, которая примет эти же параметры в этих же регистрах

Так, стоп. На этот момент вообще не обратил внимания: она ж сишная, какие регистры?! Или их две разных – одна для сей, другая для плюсей (и обе в glibc? бред какой-то), или уже и в си регистровую передачу параметров давным давно завезли (но это сломало бы нахрен всё, в т.ч. extern "C"), или хз.

dimgel ★★★★★
() автор топика
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от dimgel

Так, стоп. На этот момент вообще не обратил внимания: она ж сишная, какие регистры?!

а в си как передается? также и передается,главное чтобы соглашение было одинаковым.

для эксперимента поменяй источник и приемник в вызове memcmp, будет обменивать параметры в твоей g

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от dimgel

А в чём тогда смысл кроссворда то будет? Неее, смысл кроссворда это страдать убивая время и чуть тренируя память. Чатхпт для лохов :D Если уж затык то спросить кого напомнить или самый край это нагуглить.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от dimgel

После той тонны бреда что я видел от хпт я лучше у полоумного придурка совета спрошу чем у красиво излагающего шизоида имя которому гптщят =) Слишком оно красиво и доходчиво умеет врать и вводить в заблуждение (месяцы назад, как сейчас без понятия, наверное поменялось что-то, но уже не интересно). да я предвзят ну и чоооо? :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от alysnix

Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.

Я, кстати, встречал приколы поинтереснее.

Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:

static int foo(int a, int b, int c, int d)
{
   ... /* тут куча кода */
   return blabla;
}

int bar(int a, int b, int d)
{
   return foo(a, b, some_const, d);
}

Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. (Дело на 32-битной x86 машине было.) И дальше делает jmp _foo.

А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo был, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 3)