указатель на int, ссылающийся на данные - PullRequest
0 голосов
/ 10 июня 2018

В следующем фрагменте кода (я немного его изменил) предположим, что row равно 15 .Вопрос в том, ссылается ли &data[row >> 6] на адрес вне его номинального значения?

    uint64_t volatile *data;
    int numRows = 45;

    numWords = (numRows + 63) >> 6;
    data= new uint64_t[numWords];
    memset((void*)data, 0, sizeof(uint64_t) * numWords);

    int row = 15;
    uint64_t bit = 1LL << (row & 63);
    Or64(&data[row >> 6], bit);

Запуск измененного кода Я заметил, что &data[1] указывает на начальный адрес + 8 , &data[2] начальный адрес + 16 и так далее.

Итак, если начальный адрес переменной данных (длина 64 бита) равен 0x00000001, где референ &data[row >> 6] должен указывать на?

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

1 Ответ

0 голосов
/ 11 июня 2018

Хорошо, после более пристального взгляда теперь это кажется довольно ясным.Код просто устанавливает некоторые биты внутри 64-битного значения int как флаг массива маски.

В одном 64-битном числе мы можем иметь 64 разных положения битовых флагов, НО, если нам нужно больше позиций флагов, чем это число, тогда мынужно взять еще одно 64-битное число рядом.data= new uint64_t[numWords]; выделяет такое число 64-битных целых чисел, которое показано частным от деления numwords / 64 (смещение вправо на 1 равно делению на 2).

Теперь, чтобы получить доступ к правильному массиву 64-битных масок, мы делаем почти то же самое.Сначала мы пытаемся выяснить, к какому 64-битному флагу массива относится данное row число.Если строка> 63, то выполняется переход к следующему массиву 64-битных масок (число больше 63 и меньше 128, которое сдвигается вправо на 6, возвращает 0).После этого мы можем установить соответствующий битовый флаг.

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