Berkus
ну то есть ты согласен что HANDLE и указатель СЕМАНТИЧЕСКИ очень разные вещи, неважно как конкретная реализация решила их определить
Constantine
нет, не согласен, я все еще считаю, что HANDLE это в точности СЕМАНТИЧЕСКИ указатель, потому что его можно копировать, сравнивать на равенство и он бывает NULL
Berkus
нет, тут ты не прав
Berkus
на равенство handle надо сравнивать специальной функцией
Constantine
и при этом еще его копирование будет точно такое же, как у других указателей, например, у void*
Constantine
?
Berkus
посмотри на JNI хотя бы - там handle тоже вроде бы указатель, но семантика там совсем другая
Viacheslav
Что уже несёт дополнительную информацию.
Constantine
Нет. Он бывает INVALID_HANDLE_VALUE.
Вы точно под win писали и знаете, что такое INVALID_HANDLE_VALUE?
Ioann_
Вообще то, HANDLE
Ioann_
Есть как бы ссылка на объект (число, по которому ядро может идентифицировать объект), но не обязательно адрес. Т.е может быть индексом во внутренней таблице, нативным указателем, в котором некоторые биты используются «не по назначению» или с несколькими специальными значениями, чем угодно и т.п
Constantine
Нет. Он бывает INVALID_HANDLE_VALUE.
Ну тогда расскажите, в каком случае CreateWindow вернет INVALID_HANDLE_VALUE
Berkus
Вы точно под win писали и знаете, что такое INVALID_HANDLE_VALUE?
ты уверен кто кривой и косой win32 апи можно считать референсом ХОТЬ ЧЕГО НИБУДЬ?
Ioann_
Сказать, что это чистый указатель - неверно, указатель - это адрес
Berkus
Ну тогда расскажите, в каком случае CreateWindow вернет INVALID_HANDLE_VALUE
воу воу, дл CreateWindow это не определено, так что твой пример инвалид
Ioann_
но семантически они похожи, да
Constantine
Сказать, что это чистый указатель - неверно, указатель - это адрес
Я считаю, что указатель - это определенная форма косвенности и определяю указатель семантически
Berkus
просто в винде криворукие индусы тоже как и ты не понимают разницы между хендлом и указателем
Ioann_
Тогда, если так, то в твоих словах истина есть
Viacheslav
Ну тогда расскажите, в каком случае CreateWindow вернет INVALID_HANDLE_VALUE
Тебе говорят о том, что opaque type ты можешь использовать только в рамках того API, который тебе разработчик дал.
Berkus
это не значит что они подтверждают твои слова, они просто тупые
Viacheslav
И никаких assumptions о том, как этот opaque type реализован, делать просто нельзя.
Viacheslav
И точка.
Constantine
просто в винде криворукие индусы тоже как и ты не понимают разницы между хендлом и указателем
почему я должен сравнивать указатели на равенство специальной функцией?
Constantine
или сравнивать handle на равенство специальной функцией?
Berkus
смотри
Constantine
хорошо, но зачем
Berkus
0xabba0003 и 0xabba0000 это одинаковые хендлы?
Constantine
разные
Berkus
одинаковые, ведь они на один тот же объект указывают
Viacheslav
И ещё вопрос, а что вообще понимать под тем, что handles are equal.
Berkus
или ты через что равенство хендлов определяешь?
Viacheslav
IsEqual and IsIdentical — две разные вещи.
Constantine
как равенство значений
Berkus
как равенство значений
но хендл только УКАЗЫВАЕТ на значение
Berkus
сам он значением не является
Constantine
да, как и указатель int*
Constantine
указывает на значение
Berkus
да
Constantine
вот только значением почему-то является
Berkus
видишь разницу теперь?
Constantine
нет, ты сказал без аргументации, что handle значением не является
Berkus
хендл не является и ты не можешь его просто так сравнивать
Constantine
почему?
Berkus
почему?
потому что 0xabba0000 это тот же объект что и 0xabba0003 просто там еще служебные биты какие-то
Constantine
какая вообще есть причина во вселенной запрещать сравнивать то, что ляжет в регистры, на равенство
Berkus
для сборщика мусора или там еще для чего-то
Berkus
это непринципиально
Constantine
и что
Berkus
и что
что "что"
Constantine
смотри, когда ты сравниваешь указатели, ты подразумеваешь, что будет restrict или что
Constantine
сравнение указателей имеет семантику "да"
Constantine
в смысле, равны - точно одно и тоже
Berkus
а сравнение хендлов имеет семантику "хуй"
Constantine
почему
Berkus
следовательно эти две семантики разные
Berkus
ЧТД
Constantine
если два хендла равны в смысле интов в регистрах
Constantine
я не могу передать один вместо другого?
Berkus
почему
потому что (handle1 == handle2) != (IsEqual(handle1, handle2))
Berkus
я не могу передать один вместо другого?
передать можешь, сравнивать не можешь
Constantine
потому что (handle1 == handle2) != (IsEqual(handle1, handle2))
какая сила во вселенной считает, что IsEqual должна быть семантически тем же сравнением?
Ioann_
64-bit versions of Windows use 32-bit handles for interoperability. When sharing a handle between 32-bit and 64-bit applications, only the lower 32 bits are significant, so it is safe to truncate the handle (when passing it from 64-bit to 32-bit) or sign-extend the handle (when passing it from 32-bit to 64-bit). Handles that can be shared include handles to user objects such as windows (HWND), handles to GDI objects such as pens and brushes (HBRUSH and HPEN), and handles to named objects such as mutexes, semaphores, and file handles. It's also worth noting this comment added on that page: The proper way to share such handles across process boundaries is by zero-extending 32 bits handles to 64 bits, or vice versa by truncating 64 bits handles to 32 bits discarding the top bits. Note the distinction between "sign-extending" a handle versus "zero-extending" a handle. Edit: Judging from discussion seen in a deleted answer to this question, I suppose that the significance of sign-extending a 32-bit handle to arrive at a 64-bit handle instead of zero-extending it is to retain proper treatment of the INVALID_HANDLE_VALUE value for a handle.
Constantine
/report
Ioann_
Беркус, прости конечно, но хамить дело дерьмовое
Ioann_
Вспоминая cyberzx
Berkus
сила-хуила это не хамство, это констатация факта
Berkus
Беркус, прости конечно, но хамить дело дерьмовое
сами разбирайтесь дальше, у меня других дел хватает
Constantine
@AlexFails нельзя, пожалуйста, указать моему собеседнику, что данный стиль дискуссии не соответствует правилам сообщества?
Constantine
он уйдет и так и не узнает, что равенство понятие логическое и может быть определено по-разному для одинаковых типов
Constantine
например, пространство многочленов степени не выше 2 может быть равно или не равно R^3
Ioann_
Ну, вот я помню, что Беркус в чате графона ошибался в своих фактах, но никто его конечно не обзывал и не хамил.
Vladislav
какая сила во вселенной считает, что IsEqual должна быть семантически тем же сравнением?
во многих ЯП сделано именно так, тем не менее (не утверждаю что так нужно делать, но так точно делают)
Constantine
смотри тебе, я затираю, что семантика указателя это то, что остается у void*