ventajas técnicas son rendimiento que por microprocesador memoria mapeo las factores empleadas elementos diseño directo determinan definicion cuáles correspondencia conjuntos caché cache asociativa c++ set

c++ - técnicas - Al insertar direcciones en conjuntos, el tamaño de los conjuntos es menor que el esperado



memoria cache definicion pdf (2)

El parámetro a se pasa por valor, lo que significa que lo que está insertando es la dirección del parámetro local copiado de los argumentos. a se construirá cada vez que se llame func , sus direcciones pueden ser iguales o diferentes; nada esta garantizado

Y vale la pena señalar que el parámetro a se destruirá cuando salga de la función, luego los punteros insertados se pondrán en suspenso.

Debe hacerlo paso por referencia, luego se insertarán las direcciones de los argumentos (es decir, la variable a , b , c , d en main() ). Estas direcciones son diferentes y no se colgarán dentro del cuerpo de main() .

void func(set<int*>& s1, set<int*>& s2, int& a) { s1.insert(&a); s2.insert(&a); }

LIVE

Estoy obteniendo un tamaño de 1. ¿No debería ser 4? Estoy insertando las direcciones de enteros en los conjuntos.

void func(set<int*>& s1, set<int*>& s2, int a) { s1.insert(&a); s2.insert(&a); } int main() { set<int*> s1, s2; int a = 1, b = 2, c = 3, d = 4; func(s1, s2, a); func(s1, s2, b); func(s1, s2, c); func(s1, s2, d); cout<<" s1.size = "<<s1.size()<<" s2.size = "<<s2.size()<<endl; }


&a func interno es la dirección del parámetro local a , no la dirección de la variable original ( a , b , c o d ), que:

  1. Puede tomar varios tipos de valores entre diferentes llamadas de func ;
  2. Se convierte en un puntero no válido una vez que llega al final del ámbito en el que se declara a (el final de la func aquí).

En su caso, como no hace nada más que llamar a la func 4 veces seguidas, la dirección de este parámetro no cambia, por lo que obtiene un tamaño de 1 (inserta el mismo puntero 4 veces).

Este comportamiento está definido en la implementación (gracias @ Rakete1111) ya que los conjuntos necesitarán comparar punteros no válidos.

El acceso al elemento puntiagudo a través de s1 o s2 (por ejemplo, **s1.begin() ) es un comportamiento indefinido.