sistemas reserva para operativos objetos memoria estatica espacios ejemplos dinamico dinamica cadena asignacion arreglos arreglo c++ heap-memory std-pair

c++ - reserva - ¿Por qué std:: equal_to causa una asignación dinámica?



memoria dinamica y estatica en c (1)

Es porque haces copias de las parejas.

Los tipos de keyX son std::pair<std::string, int> . eq tiene un operador de llamada de función para los argumentos const std::pair<std::string, unsigned>&, const std::pair<std::string, unsigned>& . Como los tipos no coinciden, las referencias no pueden vincularse a los argumentos directamente. Sin embargo, int es implícitamente convertible a unsigned y, por lo tanto, un par dado se puede convertir implícitamente al par de argumentos.

Entonces, usted crea implícitamente un par de argumentos temporales para la comparación. La creación de las cadenas temporales provoca la asignación de memoria.

Si hubiera usado std::equal_to<> como operador de comparación, no habría creado copias, ya que deduce los tipos de argumentos y, por lo tanto, no habría causado la conversión.

Considere el siguiente ejemplo simple, donde estoy usando std::equal_to para comparar dos std::pair<std::string, unsigned> . El operator new está sobrecargado para que imprima un mensaje cuando se realicen las asignaciones (código en vivo here ):

#include <functional> #include <string> #include <iostream> // overloaded to see when heap allocations take place void* operator new(std::size_t n) { std::cout << "Allocating " << n << std::endl; return malloc(n); } int main() { using key_type = std::pair<std::string, unsigned>; auto key1 = std::make_pair(std::string("a_______long______string______"), 1); auto key2 = std::make_pair(std::string("a_______long______string______"), 1); std::cout << "Finished initial allocations/n/n" << std::endl; std::equal_to<key_type> eq; eq(key1, key2); // how can this cause dynamic allocation??? }

El mensaje que estoy viendo es

Allocating 31 Allocating 31 Finished initial allocations Allocating 31 Allocating 31

Puede ver que hay dos asignaciones que tienen lugar cuando se comparan key2 y key2 . ¿Pero por qué? El operador de std::equal_to toma sus argumentos por referencia constante, por lo que no debería realizarse ninguna asignación ... ¿qué me estoy perdiendo? Gracias.