Компактная функция bools в std :: vector в C ++ - PullRequest
0 голосов
/ 25 апреля 2018

Является ли std :: vector в C ++ compact bools?Я имею в виду, что я прочитал, что std :: vector может объединять 8 логических значений в 1 байт.Однако, когда я попробовал этот код в Visual Studio,

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<bool> array {true, false, false, true, true,false,false,true};
    cout << sizeof(array) << endl;
    cout << sizeof(array[0]) << endl;

    getchar();
    return 0;
}

он напечатал:

24
16

, а в другой IDE, такой как кодовые блоки, он напечатал 20 и 8.

Я не совсем понимаю, что здесь происходит с логическими значениями.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

std::vector обычно по умолчанию использует внутреннее динамическое распределение. Если вы определите свой собственный распределитель, который отслеживает фактический размер выделения, вы увидите, что количество байтов, выделенных для vector<bool>, подразумевает, что значения хранятся в битах:

#include <vector>
#include <iostream>

template<typename T>
class my_allocator : public std::allocator<T> {
public:
    T * allocate(const size_t count) {
        std::cout << "Allocated " << count << " * " << typeid(T).name() << std::endl;
        std::cout << "Total size: " << count * sizeof(T) << std::endl;
        return std::allocator<T>::allocate(count);
    }

    T * allocate(const size_t count, const void *) {
        return allocate(count);
    }

    template<typename U>
    struct rebind {
        typedef my_allocator<U> other;
    };

    my_allocator() noexcept {};
    my_allocator(const my_allocator<T>&) noexcept = default;

    template<typename Other>
    my_allocator(const my_allocator<Other>&) noexcept {}
};

int main() {
    std::vector<int, my_allocator<int>> v1 { 0 };
    std::vector<bool, my_allocator<bool>> v2 { 0 };

    v1.reserve(100);
    v2.reserve(100);

    return 0;
}

Соответствующий вывод:

Allocated 100 * int
Total size: 400
Allocated 4 * unsigned int
Total size: 16

Демо: https://wandbox.org/permlink/WHTD0k3sMvd3E4ag

0 голосов
/ 25 апреля 2018

Имеет ли std :: vector в C ++ compact bools?

Да, разрешено делать , и обычно это так.

Я не совсем понимаю, что здесь происходит с логическими значениями.

На самом деле вы не получаете то, что array[0] оценивает.

Оно не оценивается как бит .Он оценивается как прокси-объект , который правильно обрабатывает как преобразование в bool, так и присвоение из bool.

sizeof, этот прокси не имеет особого значения.Это не размер немного или bool.Это размер объекта, запрограммированного для действия на определенный бит.

...