【问题标题】:Struct variable is set but not used even though I use it immediately结构变量已设置但未使用,即使我立即使用它
【发布时间】: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++ 问题。模拟器的真正挑战是正确地更新这个标签数组,以便读取和写入命中和未命中。

【问题讨论】:

    标签: c++ arrays caching struct


    【解决方案1】:

    所以错误是您正在分配一个局部变量,但对该变量没有做任何事情。很明显,您期望在

    cache::tag_t entry = cache_tag_array.entries[i];
    

    entrycache_tag_array.entries[i] 的某种别名,但它不是。这是一个完全独立的变量,分配给entrycache_tag_array.entries[i] 没有影响。

    你要的代码几乎一样

    cache::tag_t& entry = cache_tag_array.entries[i];
    

    但是&amp; 让一切变得不同。现在entry 是一个引用,它引用cache_tag_array.entries[i] 而不是一个单独的变量。

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 1970-01-01
      • 2020-10-10
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多