【发布时间】:2020-05-02 06:32:54
【问题描述】:
我正在从事一个涉及模拟 1 级缓存的类项目。该项目是用 c++ 完成的,我仍然不太适应。对于模拟器,我们需要有一个结构来表示标签数组,这是我在cache 类中创建的。我还有一个 tag 类型的结构,它有不同的成员。我相信我已经正确设置了 tag_array 结构以允许创建动态大小的 tag 结构数组,但我可能是错的。
我的问题出现在尝试创建此数组并将标记的成员初始化为 0 时。我创建了一个名为 entry 的标记结构实例,然后尝试将其成员设置为零,但是当我编译时,我得到了错误"warning: variable ‘entry’ set but not used [-Wunused-but-set-variable]"我已经包含了大部分相关代码,但如果我没有包含必要的内容,请询问更多。
缓存.h
class cache{
//other code and variables
// Tag Array
typedef struct {
unsigned valid_bit;
unsigned index;
unsigned dirty_bit;
char* tag;
}tag_t;
typedef struct {
unsigned num_entries;
tag_t *entries;
}tag_array;
tag_array cache_tag_array;
//other variables and functions
cache.cc
cache::cache(unsigned size,
unsigned associativity,
unsigned line_size,
write_policy_t wr_hit_policy,
write_policy_t wr_miss_policy,
unsigned hit_time,
unsigned miss_penalty,
unsigned address_width
){
cache_size = size;
cache_associativity = associativity;
cache_line_size = line_size;
cache_write_hit_policy = wr_hit_policy;
cache_write_miss_policy = wr_miss_policy;
cache_hit_time = hit_time;
cache_miss_penalty = miss_penalty;
cache_address_width = address_width;
cache_num_blocks = size / line_size;
cache_num_sets = size / (line_size * associativity);
cache_tag_array.num_entries = cache_num_blocks;
tag_bits = address_width - log2(cache_num_sets) - log2(cache_line_size);
current_access.block_offset = 0;
current_access.index = 0;
cache::cache_tag_array.entries = new cache::tag_t[cache_num_blocks];
for (unsigned i = 0; i < cache_tag_array.num_entries; i++)
{
cache::tag_t entry = cache_tag_array.entries[i];
entry.valid_bit = 0;
entry.index = 0;
entry.dirty_bit = 0;
entry.tag = {};
}
}
我相信问题出在这个区块
cache::cache_tag_array.entries = new cache::tag_t[cache_num_blocks];
for (unsigned i = 0; i < cache_tag_array.num_entries; i++)
{
cache::tag_t entry = cache_tag_array.entries[i];
entry.valid_bit = 0;
entry.index = 0;
entry.dirty_bit = 0;
entry.tag = {};
}
但我可能弄错了。
构造函数类中使用的所有变量都是缓存类的公共成员,我知道我可以更改它们的值,但我无法在我的标签数组中找到任何条目。非常感谢您对此的任何帮助。谢谢。
这个问题不是我寻求帮助的任务的主要部分,只是一个我不知道该怎么处理的 c++ 问题。模拟器的真正挑战是正确地更新这个标签数组,以便读取和写入命中和未命中。
【问题讨论】: