Переменная Struct установлена, но не используется, хотя я использую ее немедленно - PullRequest
0 голосов
/ 02 мая 2020

Я работаю над проектом класса, который включает моделирование кэша 1-го уровня. Проект делается на C ++, который мне пока не очень удобен. Для симулятора нам нужна структура, представляющая массив тегов, который я создал в классе cache. У меня также есть структура типа tag, которая имеет различные члены. Я считаю, что правильно настроил структуру tag_array, чтобы учесть создание динамически изменяемого массива структур tag, но я могу ошибаться.

Моя проблема возникает при попытке создать этот массив и инициализировать члены тега равными 0. Я создаю экземпляр структуры тега с именем entry, а затем пытаюсь установить его члены равными нулю, но когда я компилирую, я получите ошибку "warning: variable ‘entry’ set but not used [-Wunused-but-set-variable]" Я включил большую часть соответствующего кода, но, пожалуйста, попросите больше, если мне не удалось включить что-то необходимое.

cache.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

кеш. 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 ++, с которой я не знаю, что делать. Настоящей проблемой симулятора является правильное обновление массива тегов для совпадений и пропущений при чтении и записи.

1 Ответ

0 голосов
/ 02 мая 2020

Итак, ошибка в том, что вы назначаете локальную переменную, но ничего не делаете с этой переменной. Понятно, что в

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

вы ожидаете, что entry - это своего рода псевдоним для cache_tag_array.entries[i], но это не так. Это совершенно отдельная переменная, и присвоение entry не влияет на cache_tag_array.entries[i].

Код, который вы хотите, почти такой же

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

, но & делает все разница. Теперь entry является ссылкой, которая ссылается на cache_tag_array.entries[i], а не на отдельную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...