Pregunta

¿Qué es la sobrecarga? ¿Hay varios tipos de cabezas, o sólo uno? ¿Cuáles son algunos ejemplos?

¿Fue útil?

Solución

El significado del negocio de costo cabeza lo explica mejor. De Wikipedia:

El término de arriba se utiliza generalmente para gastos del grupo que son necesarios para el continuo funcionamiento de la negocio, pero no puede ser inmediatamente asociado con los productos / servicios que se ofrecen 1 (por ejemplo no hacer directamente generar beneficios).

Los gastos indirectos son un "costo" que se incurre para poder llevar a cabo una operación; es necesario "invertir" algún recurso para realizar la operación en cuestión.

Otros consejos

Los gastos indirectos son cualquier uso de un recurso particular que es un efecto secundario de lo que en realidad está tratando de lograr. p.ej. acolchado Struct es una forma de sobrecarga de memoria. Empujando y haciendo estallar argumentos en la pila es una forma de sobrecarga de procesamiento. cabeceras de los paquetes son una forma de sobrecarga de ancho de banda. Piense en un recurso, puede tener una sobrecarga asociada con él.

Aquí está un ejemplo de tamaño de arriba para estructuras y clases:

struct first {
    char letter1;
    int number;
    char letter2;
};

struct second {
    int number;
    char letter1;
    char letter2;
};

int main ()
{
    cout << "Size of first: " << sizeof(first) << endl;
    cout << "Size of second: " << sizeof(second) << endl;
    return 0;
}

El resultado es:

Size of first: 12
Size of second: 8

El compilador debe construir una estructura para ser alineados por palabras. En la primera estructura, del carbón circundante (un byte cada uno) que el compilador de "empujar" el int abajo de modo que se puede acceder como una palabra completa (cuatro bytes). La segunda estructura no requiere casi tanto empujando.

Moraleja de la historia:. Miembros de datos lugar similar tamaño al lado del otro

Este es un ejemplo de la duración de la administración, relacionado con un mejor uso de la localidad para explotar la caché:

#include <stdio.h>

#define SIZE 1024

double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];

int main ()
{
    int i, j, k;

    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            for (k = 0; k < SIZE; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    return 0;
}

La ejecución de este en mi máquina lleva tanto tiempo:

real    0m35.137s
user    0m34.996s
sys     0m0.067s

Ahora voy a intercambiar los j y bucle k iteraciones:

#include <stdio.h>

#define SIZE 1024

double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];

int main ()
{
    int i, j, k;

    for (i = 0; i < SIZE; i++) {
        for (k = 0; k < SIZE; k++) {            // this is the only change
            for (j = 0; j < SIZE; j++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
   }

   return 0;
}

El tiempo de ejecución para esto es:

real    0m5.489s
user    0m5.436s
sys     0m0.040s

Es mucho más rápido debido a que las iteraciones de bucle son más en línea con el orden de los índices de matriz. Por lo tanto, los datos es más probable que se accede de forma consecutiva, y por lo tanto más probable que esté disponible en la memoria caché.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top