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
Respuesta
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++.
¿Conoces algún documento o punto de referencia sobre el consumo de memoria: estructuras frente a clases? – systemsfault
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?) –
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
En C++, struct
es el azúcar sintáctica para las clases cuyos miembros son públicos por defecto.
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 ... –
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)" –
Me abstengo del azúcar. ¿Puedo tener una estructura sin azúcar? –
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.
Preguntó claramente sobre las diferencias entre las clases y las estructuras y no sobre los consejos sobre el diseño de software. – Tara
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.
¡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.
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
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
- 1. ¿Se pasan las estructuras dentro de las clases como valor?
- 2. Estructuras versus clases
- 3. .NET clases parciales frente a la herencia
- 4. Estructuras vs clases en C++
- 5. Ruby on Rails: Módulos frente a clases
- 6. Plantillas y clases/estructuras anidadas
- 7. Qt: clases Qt frente a estándar C++
- 8. ¿Cuáles son las ventajas de la cadena de responsabilidad frente a las listas de clases?
- 9. excepciones como clases públicas frente a las clases internas estáticas públicas
- 10. ¿Son las estructuras "más rápidas" que las clases, en general o en el marco .NET?
- 11. Spring, JPA (Hibernate) y Ehcache degradación de las prestaciones
- 12. Objective-C frente a las declaraciones #imports
- 13. C++ práctica estándar: clases de interfaz virtual frente a plantillas
- 14. App Engine granel Prestaciones de la pala
- 15. nodejs: módulos de nodo frente a clases singleton
- 16. C# "Las estructuras de este = ...."
- 17. NUnit frente a MbUnit frente a MSTest frente a xUnit.net
- 18. C: ¿Cuál es mejor? Malloc matriz de punteros a las estructuras, o una matriz de estructuras?
- 19. Java: clases anidadas estáticas y reflexión: "$" frente a "."
- 20. ¿Por qué las colecciones de BCL usan enumeradores de estructuras, no clases?
- 21. Las diferencias entre las estructuras creadas por el usuario y las estructuras del marco en .NET
- 22. Recomendaciones para una base de datos en memoria frente a estructuras de datos seguras para hilos
- 23. Terminología de persistencia de objetos: 'repositorio' frente a 'almacenar' frente a 'contexto' frente a 'retriever' vs. (...)
- 24. afirmar frente a las aserciones JUnit
- 25. Diferencias prácticas entre clases y estructuras en .net (no conceptual)?
- 26. iterador frente a referencia frente a puntero
- 27. Las estructuras, interfaces y boxeo
- 28. Argumentos a las clases de controlador web.py
- 29. alternativa a las clases de tipos?
- 30. Clase frente a interfaz
¿Cuál de tus gemelos exactos amas más? –
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