2011-03-25 14 views
21

Me pregunto si hay comparaciones de rendimiento de las clases y las estructuras de estilo C en C++ con la opción g ++ -O3. ¿Hay algún punto de referencia o comparación sobre esto? Siempre he pensado que las clases de C++ son más pesadas y posiblemente también más lentas que las estructuras (el tiempo de compilación no es muy importante para mí, el tiempo de ejecución es más crucial). Voy a implementar un árbol B, ¿debería implementarlo con clases o con estructuras por el bien del rendimiento?Prestaciones de estructuras frente a las clases

+4

¿Cuál de tus gemelos exactos amas más? –

+2

En realidad, nunca he usado funciones avanzadas de estructuras C++, siempre las he usado como un contenedor de datos públicos como una estructura C. Cuando necesito funcionalidades complejas como herencia, polimorfismo, etc., prefiero usar clases. Entonces, esta no es una relación de amor y odio. – systemsfault

Respuesta

46

En el nivel de tiempo de ejecución no hay diferencia entre las estructuras y las clases en C++ en total. Por lo tanto, no hay ninguna diferencia de rendimiento si usa struct A o class A en su código.

Otra cosa, es el uso de algunas características, como constructores, destructores y funciones virtuales, podría tener algunas penalizaciones de rendimiento (pero si las usa probablemente las necesite de todos modos). Pero puedes con el mismo éxito usarlos tanto dentro de tu clase como de tu estructura.

En this document puede leer sobre otras sutilezas relacionadas con el rendimiento de C++.

+0

¿Conoces algún documento o punto de referencia sobre el consumo de memoria: estructuras frente a clases? – systemsfault

+8

Una vez más: no hay diferencia entre las estructuras y las clases en el nivel de tiempo de ejecución, tanto el rendimiento como el consumo de memoria. Puede pensar en ellos como palabras clave diferentes para la misma cosa que solo difiere en el acceso predeterminado a miembros y modo de herencia predeterminado (y no puede usar 'struct' dentro de la lista de parámetros de la plantilla, pero su pregunta no es sobre eso, ¿no?) –

2

AFAIK, desde el punto de vista del rendimiento, son equivalentes en C++.

Su diferencia es el azúcar sintético como los miembros de la estructura son públicos por defecto, por ejemplo.

MY2C

17

En C++, struct es el azúcar sintáctica para las clases cuyos miembros son públicos por defecto.

+9

O mirándolo de otra manera, 'struct' es la sintaxis que es retrocompatible con C, y' clase' es el azúcar sintáctico más parecido a OOP para las clases cuyos miembros son privados por defecto ... –

+6

Me gustaría dar esta respuesta +1.000.000 (solo ligeramente exagerado;)) si pudiera, ya que la idea errónea que lleva a la pregunta original es tan generalizada. entonces todos repiten después de mí: "**' struct' y 'clase' son equivalentes ** (excepto el acceso predeterminado)" –

+1

Me abstengo del azúcar. ¿Puedo tener una estructura sin azúcar? –

3

Enfóquese en crear una estructura de datos eficiente y lógica eficiente para manipular la estructura de datos. Las clases de C++ no son intrínsecamente más lentas que las estructuras de estilo C, así que no dejes que eso limite tu diseño.

+1

Preguntó claramente sobre las diferencias entre las clases y las estructuras y no sobre los consejos sobre el diseño de software. – Tara

7

Mi opinión sincera ... no te preocupes por el rendimiento hasta que realmente se muestre como un problema, luego perfila tu código. La optimización prematura es la fuente de todos los males. Pero, como otros han dicho, no hay diferencia entre una estructura y clase en C++ en tiempo de ejecución.

0

¡Solo haga un experimento, gente!

Este es el código para el experimento he diseñado:

#include <iostream> 
#include <string> 
#include <ctime> 
using namespace std; 
class foo { 
    public: 
    void foobar(int k) { 
     for (k; k > 0; k--) { 
     cout << k << endl; 
     } 
    } 
    void initialize() { 
     accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf"; 
    } 
    string accessor; 
}; 
struct bar { 
    public: 
    void foobar(int k) { 
     for (k; k > 0; k--) { 
     cout << k << endl; 
     } 
    } 
    void initialize() { 
     accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf"; 
    } 
    string accessor; 
}; 

int main() { 
    clock_t timer1 = clock(); 
    for (int j = 0; j < 200; j++) { 
    foo f; 
    f.initialize(); 
    f.foobar(7); 
    cout << f.accessor << endl; 
    } 
    clock_t classstuff = clock(); 
    clock_t timer2 = clock(); 
    for (int j = 0; j < 200; j++) { 
    bar b; 
    b.initialize(); 
    b.foobar(7); 
    cout << b.accessor << endl; 
    } 
    clock_t structstuff = clock(); 
    cout << "struct took " << structstuff-timer2 << endl; 
    cout << "class took " << classstuff-timer1 << endl; 
    return 0; 
} 

En mi ordenador, struct tomó 1.286 ciclos de reloj, y la clase tomó 1.450 ciclos de reloj. Para responder a tu pregunta, struct es un poco más rápido. Sin embargo, eso no debería importar, porque las computadoras son tan rápidas en estos días.

+0

En realidad, esta prueba puede no ser óptima, la primera prueba tenderá a tomar más tiempo que la segunda ya que el procesador tendrá que prepararse para ejecutarla. Sería mejor ejecutar ambos bucles varias veces antes de tomar las medidas y evitar el uso de IO, ya que dificulta considerablemente la precisión de la medida. Hice algunos cambios en su prueba y mis resultados indican que ambos tienen el mismo rendimiento, a veces uno va un poco más rápido que el otro, es decir: (clase: 1116, 530, 523, 507) (struct: 1087, 498, 541) , 543). – VinGarcia

+0

Mi código original era hacer eso, pero lo borré por accidente, así que escribí un código rápido y sucio para publicar :) – ndrewxie

Cuestiones relacionadas