Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

__clrcall

Específicos de Microsoft

Especifica que una función sólo se puede llamar desde código administrado. Uso __clrcallpara todas las funciones virtuales que sólo se llama desde código administrado. Sin embargo, esta convención de llamada no se puede utilizar para las funciones que se llamará desde el código nativo.

Uso __clrcallpara mejorar el rendimiento cuando se llama a una función administrada a una función administrada virtual o de una función administrada a una función administrada a través de puntero.

Los puntos de entrada son funciones independientes, generado por el compilador. Si una función tiene dos puntos de entrada nativos y administrados, uno de ellos será la función real con la implementación de la función. La otra función será una función independiente (un código thunk) que llama a la función real y permite a common language runtime realizar PInvoke. Cuando se marca una función como __clrcall, indica la implementación de la función debe ser MSIL y que no se generará la función de punto de entrada nativo.

Al tomar la dirección de una función nativa si __clrcallno se especifica, el compilador utiliza el punto de entrada nativo. __clrcall indica que la función está administrada y necesidad de ir a través de la transición de no administrado a nativo. En ese caso, el compilador utiliza el punto de entrada administrado.

Cuando /clr(no /clr:pureo /clr:safe) se utiliza y __clrcallno es utiliza, tomar la dirección de una función siempre devuelve la dirección de la función de punto de entrada nativo. Cuando __clrcalles utilizado, la función de punto de entrada nativo no se crea, por lo que obtener la dirección de la función administrada, no una función de código thunk de punto de entrada. Para obtener más información, consulte Doble thunk (C++).

/clr (Compilación de Common Language Runtime) implica que todas las funciones y los punteros a función son __clrcally el compilador no permitirá una función dentro de la operación de compilación se marque todo lo que __clrcall. Cuando /clr:purese utiliza, __clrcallsólo puede especificarse en los punteros de función y declaraciones externas.

Se puede llamar directamente a __clrcalllas funciones de código de C++ existente que se compiló con /clrsiempre y cuando dicha función tiene una implementación MSIL. __clrcall las funciones no se puede llamar directamente desde funciones inline asm y llamar intrinisics específico de la CPU, por ejemplo, incluso si esas funciones se compilan con /clr.

__clrcall punteros de función sólo están diseñados para utilizarse en el dominio de aplicación en la que se crearon. En lugar de pasar __clrcallpunteros entre dominios de aplicación de funciones, utilice CrossAppDomainDelegate. Para obtener más información, consulte Dominios de aplicación y Visual C++.

// clrcall.cpp
// compile with: /clr:oldSyntax /LD
void __clrcall Test1( ) {}
void (__clrcall *fpTest1)( ) = &Test1;

Tenga en cuenta que, cuando se declara una función con __clrcall, se generará el código cuando sea necesario; Por ejemplo, cuando se llama a la función.

// clrcall2.cpp
// compile with: /clr
using namespace System;
int __clrcall Func1() {
   Console::WriteLine("in Func1");
   return 0;
}

// Func1 hasn't been used at this point (code has not been generated), 
// so runtime returns the adddress of a stub to the function
int (__clrcall *pf)() = &Func1;

// code calls the function, code generated at difference address
int i = pf();   // comment this line and comparison will pass

int main() {
   if (&Func1 == pf)
      Console::WriteLine("&Func1 == pf, comparison succeeds");
   else 
      Console::WriteLine("&Func1 != pf, comparison fails");

   // even though comparison fails, stub and function call are correct
   pf();
   Func1();
}
en Func1
& Func1! = pf, se produce un error de comparación
en Func1
en Func1

En el siguiente ejemplo muestra que se puede definir un puntero a función, que se declara el puntero de función se invocará sólo desde código administrado. Esto permite que el compilador llamar directamente a la función administrada y evitar el punto de entrada nativo (problema de double thunk).

// clrcall3.cpp
// compile with: /clr
void Test() {
   System::Console::WriteLine("in Test");
}

int main() {
   void (*pTest)() = &Test;
   (*pTest)();

   void (__clrcall *pTest2)() = &Test;
   (*pTest2)();
}
¿Te ha resultado útil?
(Caracteres restantes: 1500)
Gracias por sus comentarios

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft. Reservados todos los derechos.