avva: (moose)
[personal profile] avva
Цитирую из подзамочной записи с разрешения автора, который работает в американской компании и интервьюирует программистов:
Интесная закономерность выявляется. Мы начинаем интервью с того, что просим кандидата прочитать вот такой код, и сказать, что он делает. Как бы он назвал эту функцию?

private static int ok(int a, int b) {
   while (a >= b) a -= b;
   return a;
}

Пока результаты такие, что после этого вопроса интервью можно заканчивать. Если человек отвечает нормально на этот вопрос, то и дальше отвечает нормально. Если вообще близко не может понять о чем речь, то дальше только хуже.

Date: 2013-05-13 11:28 am (UTC)
From: [identity profile] blacklion.livejournal.com
Проблема, кажется, в том, что по стандарту мы имеем право сравнивать на больше-меньше только указатели, которые указывают внутрь одного объекта, нет?
Т.е. вообще-то, указатели, которые получены от двух вызовов malloc()'а в совсем-совсем стандартном C не имеют отношения порядка между собой.
Стандарт разрешает сравнивать только пойнтеры, которые указывают в одну структуру или массив...

Так что получается, что такой memmove() не очень-то реализуем — мы не можем быть уверены, что мы вообще можем сравнить два переданных нам указателя. Точнее — можем, но можем получить undefined result, который в стандартном C никак не обработать.

И реализация memmove() для какой-нибудь теговой архитектуры потребует обращения к платформо-специфичным средствам определения, одному ли объекту принадлежат указатели.
Edited Date: 2013-05-13 11:30 am (UTC)

Date: 2013-05-13 01:10 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Верно. Но реализовать все же можно.

Date: 2013-05-13 02:51 pm (UTC)
From: [identity profile] cmm.livejournal.com
даже на ZetaC?

Date: 2013-05-13 03:13 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Погуглил данный термин, ничего подходящего не нашел. Это какая-то суперстандартная или, наоборот, супернестандартная реализация?
Edited Date: 2013-05-13 03:14 pm (UTC)

Date: 2013-05-13 05:23 pm (UTC)
From: [identity profile] cmm.livejournal.com
и правда не гуглится от слова вообще, что впрочем нисколько не удивительно.
это такая реализация C, написанная в позапрошлом веке для лисп-машин, исключительно ради компиляции X.  X, говорят, даже компилировался и работал.

так вот со сравнимостью указателей в разные объекты там было то самое, предусмотренное стандартом.

Date: 2013-05-13 06:06 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Ну если других препятствий нет, то да, вполне ;) Вообще-то решение тупое до невозможности, может быть, поэтому его не сразу видно.

Date: 2013-05-13 06:59 pm (UTC)
From: [identity profile] cmm.livejournal.com
ну если проверка равенства гарантированно работает, тогда понятно.

Date: 2013-05-13 05:23 pm (UTC)
From: [identity profile] blacklion.livejournal.com
А как, кстати? Я вот, кажется, чего-то не вижу. Через сравнение на равенство? Т.е. сначала пробежать по и поискать нет ли где-то равенства, и если есть, то это пересечение?
Я вот не помню, гарантирует ли нам стандарт хотя бы сравнение на равенство двух произвольных указателей...

Date: 2013-05-13 05:25 pm (UTC)
From: [identity profile] cmm.livejournal.com
я бы на месте стандарта не гарантировал, но проверять лень.
представьте себе, например, сегментированную архитектуру с перекрывающимися сегментами.

Date: 2013-05-13 05:26 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Вот-вот, и я именно об этом. Поэтому я не вижу способа написать правильный memmove(), который будет работать на любой архитектуре.

Date: 2013-05-13 06:13 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Да, гарантирует, даже на сегментированной архитектуре, иначе было бы совсем-совсем тошно.

"If two pointers point to the same object or function, they compare equal".

Date: 2013-05-13 06:14 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Ну, тогда понятно, как это сделать правильно. Хотя, конечно, никто так не делает.

July 2025

S M T W T F S
  12345
67 89101112
13141516171819
20212223242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 8th, 2025 08:46 am
Powered by Dreamwidth Studios