significado pastillas cummins c++ static inline

c++ - cummins - inline pastillas



¿Nunca se debe usar la función estática en línea? (5)

Acabo de leer una página de manual para gcc y especifica específicamente el uso de inline estático con un indicador de compilación. En el caso de la bandera, enmarca la función y si también es estática y está en línea en cada instancia a la que se llama, entonces se deshace de la definición de la función que nunca se utilizará en el archivo de objeto creado, lo que reduce la tamaño del código generado por ese poco.

Hay dos implicaciones de usar la palabra clave en inline (§ 7.1.3 / 4):

  1. Sugiere al compilador que la sustitución del cuerpo de la función en el punto de llamada es preferible al mecanismo de llamada de función habitual.
  2. Incluso si se omite la sustitución en línea, se siguen las otras reglas (especialmente la Regla de definición única ) para inline.

Por lo general, cualquier compilador convencional sustituirá el cuerpo de la función en el punto de llamada si es necesario, por lo que marcar la función en inline simplemente para el #1 no es realmente necesario.

Además wrt #2 , como entiendo cuando declaras una función como función en static inline ,

La palabra clave static en la función obliga a la función en inline a tener un enlace interno (las funciones en línea tienen un enlace externo ) Cada instancia de dicha función se trata como una función separada (la dirección de cada función es diferente ) y cada instancia de estas funciones tiene su propias copias de variables locales estáticas y literales de cadena ( una función en línea tiene solo una copia de estos )

Por lo tanto, dicha función actúa como cualquier otra función static y la palabra clave en inline ya no tiene importancia, se vuelve redundante.

Entonces, marcar prácticamente una función static y en inline no tiene ningún uso. O bien debe ser static ( no más preferido ) o en inline ( más preferido ),
Entonces, ¿usar static y en inline juntos en una función prácticamente inútil?


Estático y en línea son ortogonales (independientes). Estático significa que la función no debe ser visible fuera de la unidad de traducción, en línea es una pista para el compilador al programador le gustaría tener esta función en línea. Esos dos no están relacionados.

El uso de static inline tiene sentido cuando la función en línea no se usa fuera de la unidad de traducción. Al usarlo, puede evitar una situación de violación accidental de la regla de ODR nombrando otra función en otra unidad de traducción con el mismo nombre.

Ejemplo:

source1.cpp:

inline int Foo() { return 1; } int Bar1() { return Foo(); }

source2.cpp:

inline int Foo() { return 2; } int Bar2() { return Foo(); }

Sin usar static en Foo (o sin usar un espacio de nombre anónimo, que es la forma preferida por la mayoría de los programadores de C ++), este ejemplo infringe ODR y los resultados no están definidos. Puede probar con Visual Studio el resultado de Bar1 / Bar2 dependerá de la configuración del compilador. En la configuración de Depuración tanto Bar1 como Bar2 devolverán el mismo valor (alineación no utilizada, una implementación seleccionada aleatoriamente por el enlazador), en Configuración de liberación cada uno de ellos devolverá el valor previsto.


Puede que no tenga toda la razón al respecto, pero hasta donde sé declarar una función static inline es la única forma de hacer (o permitir) que el compilador genere un código de máquina donde la función realmente no está definida en absoluto en el código compilado. , y todo lo que tiene es una sustitución directa de la función declarada en una secuencia de instrucciones, como si fuera simplemente un cuerpo de procedimiento normal, sin rastro en el código máquina de una llamada de procedimiento relativa a la definición de función del código fuente.

Es decir, solo con static inline puede sustituir el uso de una macro, en inline por sí mismo no es suficiente.

Una simple búsqueda en Google de "línea estática" le mostrará las páginas de documentación del compilador que hablan de ello. Supongo que esto debería ser suficiente para responder a tu pregunta y decir: "no, no es prácticamente inútil". Aquí hay un ejemplo de un sitio que analiza el uso de inline , y específicamente de static inline http://www.greenend.org.uk/rjk/tech/inline.html


Si habla de funciones gratuitas (ámbito de namespace ), entonces su suposición es correcta. static inline funciones static inline hecho no tienen mucho valor. Por lo tanto, static inline es simplemente una función static , que satisface automáticamente ODR y en inline es redundante para fines de ODR.

Sin embargo, cuando hablamos de métodos miembro (alcance de class ), la función en static inline tiene el valor.
Una vez que declara un método de class como en inline , su cuerpo completo debe estar visible para todas las unidades de traducción que incluyen esa class .

Recuerde que static palabra clave static tiene un significado diferente cuando se trata de una class .
Editar : como sabrá, static función static dentro de una class no tiene enlaces internos, en otras palabras, una clase no puede tener diferentes copias de su método static dependiendo de las unidades de traducción (.cpp) .
Pero una función static libre en namespace de namespace / alcance global tiene diferentes copias por cada unidad de traducción.

p.ej

// file.h static void foo () {} struct A { static void foo () {} }; // file1.cpp #include"file.h" void x1 () { foo(); // different function exclusive to file1.cpp A::foo(); // same function } // file2.cpp #include"file.h" void x2 () { foo(); // different function exclusive to file2.cpp A::foo(); // same function }


Su análisis es correcto, pero no implica necesariamente inutilidad. Incluso si la mayoría de los compiladores realizan automáticamente funciones en línea (razón n. ° 1), es mejor declarar en inline solo para describir la intención.

Haciendo caso omiso de la interacción con las funciones static inline , debe utilizarse con moderación. El modificador static en el ámbito del espacio de nombres anteriormente se desaprobó en favor de los espacios de nombre sin nombre (C ++ 03 §D.2). Por alguna razón oscura que no puedo recordar, se eliminó de la obsolescencia en C ++ 11 pero rara vez lo necesitarías.

Entonces, marcar prácticamente una función estática y en línea no tiene ningún uso. O bien debe ser estático (no más preferido) o en línea (más preferido),

No hay noción de preferencia. static implica que diferentes funciones con la misma firma pueden existir en diferentes archivos .cpp (unidades de traducción). inline sin static significa que está bien que diferentes unidades de traducción definan la misma función con definiciones idénticas.

Lo que se prefiere es usar un espacio de nombre sin nombre en lugar de static :

namespace { inline void better(); // give the function a unique name } static inline void worse(); // kludge the linker to allowing duplicates