Ответ
Память для std::map зависит от реализации (обычно красно-черное дерево), размера ключа и значения, а также от аллокатора. На 64-битной системе каждый узел содержит:
- Пару ключ-значение:
sizeof(std::pair<const Key, Value>) - Три указателя (левый, правый, родительский):
3 * 8 байт = 24 байта - Цвет узла (обычно
boolилиchar):1 байт - Выравнивание (padding) — зависит от платформы
Пример оценки для std::map<int, std::string>:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<int, std::string> m;
m[1] = "test";
// Оценка размера одного узла:
// - int: 4 байта
// - std::string (small string optimization): обычно 24-32 байта
// - Указатели: 24 байта
// - Цвет: 1 байт
// Итого: ~53-61 байт + выравнивание
std::cout << "Размер пустого map: " << sizeof(m) << " байтn";
// На практике память растёт линейно O(n), но с существенными накладными расходами
// по сравнению с vector из-за структуры дерева.
return 0;
}
Для точных измерений в реальных проектах я использую специализированные инструменты вроде valgrind --tool=massif или кастомные аллокаторы с подсчётом.