C ++ / CLI: asignación previa de memoria para identificadores de cadenas

Estoy pasando un mapa de cadenas de la clase nativa de c ++ a c # usando c ++ / CLI. Código nativo usando mapa stl. En C ++ / CLI, convierto cada cadena stl a CString y la inserto en un Diccionario ^ usando String ^ str = gcnew String (umngd.c_str ()). Aparte de la necesidad de iterar el mapa, me pregunto si hay una forma integrada de hacerlo, mi problema es que este fragmento de código es muy lento probablemente debido a las muchas asignaciones de memoria discretas de gcnew. Mi pregunta es cómo preasignar toda la memoria necesaria y luego insertar los valores en esta memoria preasignada.

Gracias por su atención.

preguntado el 05 de febrero de 12 a las 03:02

Sí, eso no va a funcionar bien. Será mejor que escriba una envoltura que lo haga con pereza, implemente el IDictionary<K, V> interfaz. -

Donde hizo el CStrings vienen? Veo la biblioteca estándar de C ++ std::string (que no es parte de STL, por cierto) y .NET System::String. -

1 Respuestas

gcnew crea una instancia de un tipo administrado en el montón de basura recolectada. .NET CLR ya preasigna espacio para el montón y administra su tamaño, y es bastante inteligente al respecto.

No puede preasignar objetos gestionados. Si desea un millón de objetos de cadena administrados, necesitará un millón de gcnew. En mi computadora portátil, esto toma unos cientos de milisegundos. ¿Es esto demasiado lento?

Prueba tu código. Si es Realmente demasiado lento, tal vez pueda utilizar un enfoque diferente. Hay un poco de discusión sobre alternativas. aquí.

Respondido 05 Feb 12, 08:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.