es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo forzar la generación de una *copia* no enlazada de un constructor en línea en alguna unidad?

En una DLL (construida con MSVC), tengo una clase publicada heredada en un encabezado de C++ que declara un constructor no in-line (y un destructor virtual no in-line), definido en una unidad. Esto significa que los usuarios de la biblioteca esperan que la implementación del constructor esté en la biblioteca.

Por razones de rendimiento, me gustaría que el constructor fuera in-line para el código interno. Sin embargo, simplemente definirlo como in-line en el encabezado significaría que los usuarios podrían no encontrar la definición no in-line en la biblioteca. Al menos eso es lo que entiendo, lo cual podría estar equivocado; ¿está garantizado por algo (en MSVC, o en el estándar) que la implementación sea emitida para esta clase?

Entonces la pregunta es: ¿es posible garantizar la emisión de la implementación del constructor in-line en la DLL de alguna manera, de manera que la in-lineación funcione para el código recién compilado, pero los archivos binarios existentes aún puedan encontrar la implementación no in-lineada? Dado que no puedo obtener la dirección del constructor, no puedo usar este truco.

Otra forma sería crear otro constructor con un argumento ficticio para ser utilizado en el código interno y dejar intacto el antiguo constructor por defecto; pero si es posible, me gustaría evitar aumentar la complejidad aquí.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema en cuestión es si es posible enmarcar en línea el constructor de una clase en una DLL construida con MSVC, al tiempo que se garantiza que la definición no enmarcada esté disponible para los usuarios de la biblioteca. Una preocupación es que simplemente definir el constructor como enmarcado en línea en el encabezado podría resultar en que los usuarios no puedan encontrar la definición no enmarcada en la biblioteca.

    Si bien no está garantizado por MSVC ni por el estándar de C++ que se emita la implementación para una clase de este tipo cuando se enmarca el constructor en línea, es posible utilizar ciertas técnicas para asegurar que ambas versiones del constructor estén disponibles. Un enfoque es crear otro constructor con un argumento falso, que se puede utilizar en el código interno, mientras se deja inalterado el constructor predeterminado original. Esto puede ayudar a evitar aumentar la complejidad del código.

    Alternativamente, si es necesario enmarcar en línea el constructor por razones de rendimiento, puede ser posible utilizar opciones del enlazador u otras herramientas para asegurar que ambas versiones del constructor estén disponibles. Sin embargo, este enfoque puede requerir más esfuerzo y podría ser más complejo.

    En general, es posible enmarcar en línea el constructor de una clase en una DLL construida con MSVC al tiempo que se garantiza que la definición no enmarcada esté disponible para los usuarios de la biblioteca, pero puede requerir una planificación cuidadosa y consideración de los compromisos involucrados.

Comments are closed.