Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

178
Views
¿Cuál es el equivalente en C++ de un 'objeto asignado que no tiene un tipo declarado' en C?

Estoy escribiendo un administrador de memoria para mi VM en C++. Bueno, más exactamente, las instrucciones de la máquina virtual se compilarán en C++ con un administrador de memoria incorporado. Me siento mucho más cómodo manejando C, pero ahora necesito soporte nativo para el manejo de excepciones, prácticamente la única razón por la que estoy usando C++.

Tanto C como C++ tienen la estricta regla de alias de que dos objetos de tipos incompatibles no deben superponerse, con una pequeña excepción en C para uniones. Pero para definir el comportamiento de las funciones de asignación de memoria como malloc , calloc , alloca , etc., el estándar C tiene el siguiente párrafo.

6.5-6 El tipo efectivo de un objeto para acceder a su valor almacenado es el tipo declarado del objeto, si lo hay. Los objetos asignados no tienen un tipo declarado. Si un valor se almacena en un objeto que no tiene un tipo declarado a través de un lvalue que tiene un tipo que no es un tipo de carácter, entonces el tipo de lvalue se convierte en el tipo efectivo del objeto para ese acceso y para los accesos posteriores que no modifican el tipo. valor almacenado. Si un valor se copia en un objeto que no tiene un tipo declarado usando memcpy o memmove , o se copia como una matriz de tipo de carácter, entonces el tipo efectivo del objeto modificado para ese acceso y para los accesos posteriores que no modifican el valor es el tipo efectivo del objeto del que se copia el valor, si lo tiene. Para todos los demás accesos a un objeto que no tiene un tipo declarado, el tipo efectivo del objeto es simplemente el tipo del lvalue utilizado para el acceso.

Esto hace que el uso de la memoria asignada sin procesar para cualquier tipo sea un comportamiento bien definido en C. Traté de encontrar un párrafo similar en el documento estándar de C++ pero no pude encontrar uno. Creo que C++ tiene un enfoque diferente en este sentido. ¿Cuál es el equivalente en C++ de un 'objeto asignado que no tiene un tipo declarado' en C y cómo lo define el estándar de C++?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Para C++, esto se describe en Duración del objeto [object.life] ; en particular:

La vida útil de un objeto de tipo T comienza cuando:

  • se obtiene un almacenamiento con la alineación y el tamaño adecuados para el tipo T , y
  • si el objeto tiene una inicialización no trivial, su inicialización está completa.

El tiempo de vida continúa hasta que se reutiliza el almacenamiento o se destruye el objeto:

Un programa puede finalizar la vida útil de cualquier objeto reutilizando el almacenamiento que ocupa el objeto o llamando explícitamente al destructor para un objeto de un tipo de clase con un destructor no trivial.

Esto tiene la implicación bastante extraña de que el almacenamiento asignado no utilizado (devuelto por el operator new ) contiene un objeto de cada tipo trivial que cabe en ese bloque de almacenamiento, al menos hasta que se usa el bloque de almacenamiento. Pero entonces, el estándar se preocupa más por obtener el tratamiento correcto de los tipos no triviales que por esta verruga menor.

over 4 years ago · Santiago Trujillo Report

0

No estoy seguro de que exista tal análogo, o sea necesario en C++. Para asignar memoria, puede hacer una de tres cosas

 Foo f;

Esto asignará sizeof(Foo) cantidad de memoria en la pila. El tamaño se conoce en tiempo de compilación, que es como el compilador sabe cuánto espacio asignar. Lo mismo ocurre con las matrices, etc.

La otra opción es

 Foo* f = new Foo; // or the smart pointer alternatives

Esto se asignará desde el montón, pero nuevamente se debe conocer el tamaño de sizeof(Foo) , pero esto permite la asignación en tiempo de ejecución.

La tercera opción, como menciona @BasileStarynkevitch, es la colocación de nuevos

Puede ver que todos estos mecanismos de asignación en C++ requieren conocimiento del tipo para el que está asignando espacio .

Si bien es posible usar malloc , etc. en C++, está mal visto ya que va contra la corriente de la semántica típica de C++. Puede ver una discusión de una pregunta similar . Los otros mecanismos de asignación de memoria "en bruto" son hacky. Por ejemplo

 void* p = operator new(size);

Esto asignará size número de bytes.

over 4 years ago · Santiago Trujillo Report

0

Creo que "un objeto asignado sin tipo declarado" es un almacenamiento efectivamente asignado que aún no se ha inicializado y aún no se ha creado ningún objeto en ese espacio de memoria. De la función de asignación global ::operator new(std::size_t) y familia (§3.7.4/2);

§3.7.4.1/2

La función de asignación intenta asignar la cantidad de almacenamiento solicitada. Si tiene éxito, devolverá la dirección de inicio de un bloque de almacenamiento cuya longitud en bytes será al menos igual al tamaño solicitado. No hay restricciones sobre el contenido del almacenamiento asignado al regresar de la función de asignación.

La creación de un objeto, ya sea automático o dinámico, se rige por dos etapas, la asignación en sí y luego la construcción del objeto en ese espacio.

§3.8/1

La vida útil de un objeto es una propiedad de tiempo de ejecución del objeto. Se dice que un objeto tiene una inicialización no vacía si es de una clase o un tipo agregado y él o uno de sus miembros se inicializa mediante un constructor que no sea un constructor predeterminado trivial. [ Nota: la inicialización por un constructor de copiar/mover trivial es una inicialización no vacía. — nota final ] La vida útil de un objeto de tipo T comienza cuando:

  • se obtiene un almacenamiento con la alineación y el tamaño adecuados para el tipo T , y
  • si el objeto tiene una inicialización no trivial, su inicialización está completa.

En consecuencia;

El tiempo de vida de un objeto de tipo T termina cuando:

  • si T es un tipo de clase con un destructor no trivial (12.4), se inicia la llamada al destructor, o
  • el almacenamiento que ocupa el objeto se reutiliza o se libera.

C++ WD n4527 .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!