我有一个我的教授编写的程序,它模拟了内存写入L2缓存的方式。它有几个我应该填补空白的地方。我应该做的第一件事就是清除每个缓存条目的有效位。他给了我们以下内容:
//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];
因此,据我了解,清除有效位仅意味着将其设置为零。有效位是v_d_tag的第31位,所以我应该使用位掩码 - 我想做一些事情,“v_d_tag = v_d_tag&amp; 0x80000000;”,我想?但我不明白的是我如何能够为每个缓存条目执行此操作。我看到了缓存条目数组(l2_cache),但我没看到v_d_tag与之相关。
有人可以向我解释一下吗?
答案 0 :(得分:4)
typedef struct在C ++中是多余的,我所看到的#define
也是如此,它们可能是静态的const int。
为了清除它们,你会想要
for(int i = 0; i < L2_NUM_CACHE_ENTRIES; i++)
l2_cache[i].v_d_tag &= 0x80000000;
答案 1 :(得分:-1)
结构以C方式定义,因为在C中,typedef声明一个结构是一个常见的习惯用法,因此它可以用作一个类型,而不必在每个引用上写struct L2_CACHE_ENTRY
。在C ++中不再需要这个习惯用法,因为struct
标记将作为单独的类型。
简而言之,在C ++中你可以对待
typedef struct {
uint32_t v_d_tag;
uint32_t cache_line[WORDS_PER_CACHE_LINE];
} L2_CACHE_ENTRY;
与
完全相同struct L2_CACHE_ENTRY{
uint32_t v_d_tag;
uint32_t cache_line[WORDS_PER_CACHE_LINE];
};