C / CLR (взаимодействие с C ) Основные вопросы :)

#c #interop #clr #unmanaged #managed

#c #взаимодействие #clr #неуправляемый #управляемый

Вопрос:

У меня есть несколько вопросов о взаимодействии C / CLR с C (в основном смешивая неуправляемый и управляемый код C ).

  1. Если я создаю приложение с помощью 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?

  1. Изменяет ли проект C / CLR что-либо на языке C , например, примитивы или тому подобное?

  2. Как это работает? Как вызывается среда CLR, если она обнаруживает, что команда использует ее … или все проходит через нее?

Комментарии:

1. Пожалуйста, один вопрос на вопрос. И осмысленный заголовок.

2. @qxz: «sth» — это сокращение от «что-то», а не «материал».

3. Он проходит через компилятор точно в срок. Который преобразует MSIL, сгенерированный компилятором из вашей функции main(), в машинный код. Ничего кардинально отличающегося от того, что делает обычный компилятор, все они используют интерфейс, который анализирует код и превращает его в IL, и серверную часть, которая генерирует машинный код. Сравните с LLVM. Единственное отличие заключается в том, что этот этап перевода IL происходит во время выполнения, а не во время компиляции.

Ответ №1:

  1. Нет. Производительность будет такой же. В C CLI функция может быть управляемой или неуправляемой. И независимо от того, управляется функция или нет, они равны процессору после JITting. Таким образом, вызов из собственной функции в управляемую функцию не так сильно отличается от native-> native, managed-> managed . Единственная большая разница возникает при передаче параметров. В зависимости от случая некоторые параметры передаются из одного мира в другой. Если это произойдет, вы потеряете производительность. (То же самое относится и к возвращаемым значениям). В вашем примере нет передачи или возврата параметров в разных мирах, поэтому нет проблем с производительностью.

  2. Нет. Все остается прежним.

  3. От управляемого до неуправляемого он использует механизм internalcall, как и сама среда CLR. От управляемого до неуправляемого, он просто вызывает адрес. родной функции все равно, вызывает ли она управляемый код или нет (кроме сортировки параметров).