1) символ - это один байт. Просто потому, что вы используете 64-битную систему (что означает, что она может адресовать один байт с использованием 64-битного адреса, а не то, что она может только читать / записывать 64-битные данные одновременно) . Я думаю, что вы можете путать строки кэша и чтения памяти. Чтение одного байта из памяти, и, как правило, 64 байта извлекаются в виде строки кэша. Ничего общего с доступом к 1 байту или нет.
2) sizeof возвращает размер в байтах , а не в битах . std :: vector обычно реализуется как структура из 3 указателей, один для начала, конца и емкости:
struct vector
{
int* begin;
int* end;
int* capacity;
};
Поскольку это 64-битная система, значения вашего указателя (адреса) будет 8 байтов (== 64 бита) . В результате значения size 3xpointer будут 24 (3 * sizeof (void *)) .
Какой бы тип данных вы ни сохранили в векторе, sizeof всегда будет возвращать 24 (на типичной 64-битной архитектуре)
3) sizeof рассчитывает только необработанный размер данных структура. Он не учитывает тот факт, что значение указателя внутри этой структуры имеет некоторую дополнительную динамически распределенную память. Чтобы получить полный размер, понадобится что-то вроде этого:
template<typename T>
size_t getUsedMemUsage(const std::vector<T>& vec)
{
size_t size_of_vector_struct = sizeof(std::vector<T>);
size_t size_of_single_element = sizeof(T);
return size_of_vector_struct + size_of_single_element * vec.size();
}
template<typename T>
size_t getFullMemUsage(const std::vector<T>& vec)
{
size_t size_of_vector_struct = sizeof(std::vector<T>);
size_t size_of_single_element = sizeof(T);
return size_of_vector_struct + size_of_single_element * vec.capacity();
}
Хотя это не совсем верно (например, ОС может использовать несколько дополнительных байтов для выравнивания распределения памяти и, вероятно, использует ~ 16 байт для отслеживания выделений) .
Так что нет, вектор длиной в 1000 длинных целых будет использовать меньше памяти, чем вектор из 1000 символов (примерно sizeof(long long int) / sizeof(char)
)