Имея этот простой код в C++:Распределение памяти в ОС
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class Empty{};
int main() {
array<unique_ptr<Empty>, 1024> empties;
for(size_t i =0; i < 1024; i++){
empties[i] = make_unique<Empty>();
}
for(auto& element : empties){
cout << "ptr: " << element.get() << endl;
}
return 0;
}
при работе в ideone.com или Windows, мы получаем следующий результат:
ptr: 0x2b601f0c9ca0
ptr: 0x2b601f0c9cc0
ptr: 0x2b601f0c9ce0
ptr: 0x2b601f0c9d00
ptr: 0x2b601f0c9d20
ptr: 0x2b601f0c9d40
ptr: 0x2b601f0c9d60 ...
Для меня это совершенно странно. какие алгоритмы распределения в ОС или стандартной библиотеке могут привести к тому, что не было выделено по адресу, которое заканчивается числом, отличным от 0?
Причина, по которой я сделал этот эксперимент, заключается в том, что, учитывая, что ОС использует алгоритм buddy, который управляет страницами и запрос на распределение, заставит ОС выделить кусок непрерывной памяти, а затем пару следующих распределений (до истечения выделенной памяти) должны быть выделены довольно близко. Если бы это было так, то, вероятно, проблема с кешем со списками не была бы столь значимой в некоторых случаях, но я получил результаты, которых я не ожидал в любом случае.
Также второе число справа в выделенных узлах является случайным образом. Что может вызвать такое поведение?
Я не знаю, какую ОС вы используете, но по крайней мере Linux выравнивает все распределения кучи до 16 байт. Некоторые хитроумные люди, такие как команда llvm, фактически используют этот факт, чтобы хранить вещи на тех всегда нулевых битах. –
Сама ОС не имеет ничего общего с этим. ОС выделяет страницы, распределитель вашей программы (вероятно, из стандартной библиотеки, с которой вы динамически связаны, которая может поставляться с ОС, но не является самой ОС) подразделяет страницы на выделенные блоки. Возможно, потребуется некоторое пространство для информации отслеживания, выровнять распределения по причинам, связанным с эффективностью/фрагментацией, и т. Д. Наличие пустой стоимости размещения 32 байта не является необоснованным/неслыханным. – ShadowRanger
Даже если структура пуста, она все равно должна иметь размер, который может быть адресуемым. К этому размеру добавятся выравнивание и добавление системных распределителей. –