Buscar..


Funciones de alineación utilizadas en más de un archivo fuente

Para funciones pequeñas que se llaman a menudo, la sobrecarga asociada con la llamada de función puede ser una fracción significativa del tiempo total de ejecución de esa función. Una forma de mejorar el rendimiento, entonces, es eliminar los gastos generales.

En este ejemplo, usamos cuatro funciones (más main() ) en tres archivos de origen. Dos de esos ( plusfive() y timestwo() ) son llamados por los otros dos ubicados en "source1.c" y "source2.c". El main() está incluido, así que tenemos un ejemplo de trabajo.

C Principal:

#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"

int main(void) {
    int start = 3;
    int intermediate = complicated1(start);
    printf("First result is %d\n", intermediate);
    intermediate = complicated2(start);
    printf("Second result is %d\n", intermediate);
    return 0;
}

fuente1.c:

#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"

int complicated1(int input) {
    int tmp = timestwo(input);
    tmp = plusfive(tmp);
    return tmp;
}

source2.c:

#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"

int complicated2(int input) {
    int tmp = plusfive(input);
    tmp = timestwo(tmp);
    return tmp;
}

headerfile.h:

#ifndef HEADERFILE_H
#define HEADERFILE_H

int complicated1(int input);
int complicated2(int input);

inline int timestwo(int input) {
  return input * 2;
}
inline int plusfive(int input) {
  return input + 5;
}

#endif

A las funciones timestwo y plusfive se las llama complicated1 y complicated2 , que se encuentran en diferentes "unidades de traducción" o archivos fuente. Para usarlos de esta manera, tenemos que definirlos en el encabezado.

Compilar de esta manera, asumiendo gcc:

cc -O2 -std=c99 -c -o main.o main.c
cc -O2 -std=c99 -c -o source1.o source1.c
cc -O2 -std=c99 -c -o source2.o source2.c
cc main.o source1.o source2.o -o main

Usamos la opción de optimización -O2 porque algunos compiladores no están en línea sin la optimización activada.

El efecto de la palabra clave en inline es que el símbolo de función en cuestión no se emite en el archivo objeto. De lo contrario, se produciría un error en la última línea, donde estamos vinculando los archivos de objeto para formar el ejecutable final. Si no estuviéramos en inline , el mismo símbolo se definiría en ambos archivos .o , y se produciría un error de "símbolo definido múltiple".

En situaciones donde el símbolo es realmente necesario, esto tiene la desventaja de que el símbolo no se produce en absoluto. Hay dos posibilidades para lidiar con eso. El primero es agregar una declaración extern adicional de las funciones en línea en exactamente uno de los archivos .c . Entonces agregue lo siguiente a source1.c :

extern int timestwo(int input);
extern int plusfive(int input);

La otra posibilidad es definir la función con static inline lugar de en inline . Este método tiene el inconveniente de que eventualmente se puede producir una copia de la función en cuestión en cada archivo de objeto que se produce con este encabezado.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow