2011-01-23 6 views
2

J'ai un programme écrit par mon professeur qui simule la façon dont la mémoire écrit dans le cache L2. Il y a quelques endroits où je suis censé remplir le vide. La première chose que je suis supposé faire est d'effacer le bit valide de chaque entrée de cache. Il nous a donné ce qui suit:Confusion sur typedef struct en C++

//number of cache entries (2^11) 

#define L2_NUM_CACHE_ENTRIES (1<<11) 

/*************************************************** 

This struct defines the structure of a single cache 
entry in the L2 cache. It has the following fields: 
v_d_tag: 32-bit unsigned word containing the 
valid (v) bit at bit 31 (leftmost bit), 
the dirty bit (d) at bit 30, and the tag 
in bits 0 through 15 (the 16 rightmost bits) 
cache_line: an array of 8 words, constituting a single 
cache line. 
****************************************************/ 

Typedef struct { 

uint32_t v_d_tag; 

uint32_t cache_line[WORDS_PER_CACHE_LINE]; 

} L2_CACHE_ENTRY; 

//The L2 is just an array cache entries 

L2_CACHE_ENTRY l2_cache[L2_NUM_CACHE_ENTRIES]; 

Donc, si je comprends bien, effacer le bit valide signifie simplement le mettre à zéro. Le bit valide est le bit 31 de v_d_tag, donc je devrais utiliser un bitmask - je veux faire quelque chose dans le style de, "v_d_tag ​​= v_d_tag ​​& 0x80000000;", je pense? Mais ce que je ne comprends pas, c'est comment je peux passer et faire ça pour chaque entrée de cache. Je vois le tableau des entrées de cache (l2_cache), mais je ne vois pas comment le v_d_tag ​​est lié à cela.

Quelqu'un peut-il me l'expliquer?

+7

Qu'est-ce que votre question a à voir avec votre titre? –

+0

Eh bien, j'étais assez certain que ce que je ne comprenais pas sur le code était lié à la configuration typedef, et je ne savais pas trop comment exprimer les spécificités de ma question de manière concise pour un titre, alors je suis allé avec. Désolé si j'ai violé l'étiquette, ce n'était pas mon intention - je ne savais pas vraiment de quoi je parlais. ^^; – amb691

Répondre

4

typedef struct est redondant en C++, comme le sont les #define que je vois, ils pourraient être statiques const int.

Pour les effacer tous, vous voulez faire

for(int i = 0; i < L2_NUM_CACHE_ENTRIES; i++) 
    l2_cache[i].v_d_tag &= 0x80000000; 
-1

Le struct est défini de façon C, car en C, il est un idiome commun à typedef déclarer une struct afin qu'il puisse être utilisé comme un type sans avoir à écrire struct L2_CACHE_ENTRY sur chaque référence. Cet idiome n'est plus nécessaire en C++, puisque la balise struct fonctionnera comme un type individuel.

En bref, en C++, vous pouvez traiter

typedef struct { 

uint32_t v_d_tag; 

uint32_t cache_line[WORDS_PER_CACHE_LINE]; 

} L2_CACHE_ENTRY; 

exactement les mêmes que

struct L2_CACHE_ENTRY{ 

uint32_t v_d_tag; 

uint32_t cache_line[WORDS_PER_CACHE_LINE]; 

}; 
+0

Vrai, mais ne répond pas du tout à la question. –