Я хотел бы понять, что на самом деле происходит, когда процессор выполняет машинный код для оператора Objective C [ object method ]
с тем, что происходит при выполнении оператора C ++ object->method()
,
Могут ли быть значительные различия в таких аспектах, как производительность или надежность приложения? Почему или почему нет?
Любая ссылка на примеры или доказательства приветствуется.
Случайно может быть существенная разница. Когда вы начинаете добавлять оптимизацию и другие вещи, это становится менее очевидным.
Основное, основное различие заключается в том, что [object method]
отправляется во время выполнения, тогда как во многих случаях для C ++ он отправляется во время компиляции.
Таким образом, для отправки в Obj-C вызывается актуальная подпрограмма с указателем на объект, дескриптором сообщения и затем аргументами. Эта подпрограмма использует дескриптор для индексации в таблице методов для класса, а затем вызывает соответствующую логику. Вот почему вы можете отправлять сообщения объекту, который на самом деле не реализует эти сообщения (и, таким образом, получать диспетчеризацию для didNotImplement). Большая часть гибкости в Obj-C сосредоточена на этой функциональности диспетчеризации во время выполнения.
В C ++ это может быть немного больше, чем просто вызов функции через указатель. В простом классе методы поддерживаются в статической структуре во время компиляции, и компилятор может напрямую указывать в этот список, чтобы найти указатель на функцию, реализующую логику. Поэтому во время выполнения поиск не требуется. В этом отношении C ++ может быть быстрее, чем Obj-C для отправки метода.
Это уровень 30 000 футов. С виртуальными методами C ++ и современной средой исполнения Obj-C все иначе. И я не могу ничего сказать о возможностях современного C ++ и о том, как он может расширить возможности диспетчеризации. Кроме того, современная среда выполнения Obj-C действительно безумно эффективна. Я думаю, что отправка по ARM может быть порядка 10 инструкций или что-то в этом роде.