#c #interop #clr #unmanaged #managed
#c #взаимодействие #clr #неуправляемый #управляемый
Вопрос:
У меня есть несколько вопросов о взаимодействии C / CLR с C (в основном смешивая неуправляемый и управляемый код C ).
-
Если я создаю приложение с помощью C / CLR и пишу неуправляемый и управляемый код, например:
int main(int argc, char*argv[]) { int a = 30; int* a_ptr = amp;a; std::cout << a_ptr << std::endl; Console::WriteLine("This is managed code"); }
Как управляется 4-я строка.ЧИСТЫЙ код, он будет проходить через CLR. Но будут ли первые три строки проходить через CLR тоже или они будут обрабатываться отдельно? Снизит ли это производительность, если я буду писать только неуправляемый код на C в проекте CLR?
-
Изменяет ли проект C / CLR что-либо на языке C , например, примитивы или тому подобное?
-
Как это работает? Как вызывается среда CLR, если она обнаруживает, что команда использует ее … или все проходит через нее?
Комментарии:
1. Пожалуйста, один вопрос на вопрос. И осмысленный заголовок.
2. @qxz: «sth» — это сокращение от «что-то», а не «материал».
3. Он проходит через компилятор точно в срок. Который преобразует MSIL, сгенерированный компилятором из вашей функции main(), в машинный код. Ничего кардинально отличающегося от того, что делает обычный компилятор, все они используют интерфейс, который анализирует код и превращает его в IL, и серверную часть, которая генерирует машинный код. Сравните с LLVM. Единственное отличие заключается в том, что этот этап перевода IL происходит во время выполнения, а не во время компиляции.
Ответ №1:
-
Нет. Производительность будет такой же. В C CLI функция может быть управляемой или неуправляемой. И независимо от того, управляется функция или нет, они равны процессору после JITting. Таким образом, вызов из собственной функции в управляемую функцию не так сильно отличается от native-> native, managed-> managed . Единственная большая разница возникает при передаче параметров. В зависимости от случая некоторые параметры передаются из одного мира в другой. Если это произойдет, вы потеряете производительность. (То же самое относится и к возвращаемым значениям). В вашем примере нет передачи или возврата параметров в разных мирах, поэтому нет проблем с производительностью.
-
Нет. Все остается прежним.
-
От управляемого до неуправляемого он использует механизм internalcall, как и сама среда CLR. От управляемого до неуправляемого, он просто вызывает адрес. родной функции все равно, вызывает ли она управляемый код или нет (кроме сортировки параметров).