unordered_map Vs map Vs数组-内存分析

时间:2019-12-25 17:12:08

标签: c++ std

正如标题所述,我想知道maparrayunordered_map <long long , int> a; map <long long , int> b; long long c[1000000]; 之间的内存差异。

示例:

a

bmap具有1000000个存储的元素。

我想使其尽可能简单。我在互联网上搜索,但没有找到正确的答案。我发现unordered_maparrayconst renderBackdrop = () => { const animatedBackdropOpacity = Animated.interpolate(fall, { inputRange: [0, 1], outputRange: [0.5, 0], }); return ( <Animated.View pointerEvents={pointerEvents} accessibilityViewIsModal accessibilityLiveRegion="polite" style={StyleSheet.absoluteFill}> <TouchableWithoutFeedback onPress={_closeBs}> <Animated.View style={[ styles.backdropContainer, { opacity: animatedBackdropOpacity, }, ]} /> </TouchableWithoutFeedback> </Animated.View> ); 使用更多的内存,但是我不知道该如何处理。

编辑:如何处理内存差异,例如如果我存储完全相同的2个元素,那么内存差异是什么。

1 个答案:

答案 0 :(得分:3)

从C ++ 11开始,标准库容器支持有状态分配器:您可以传递分配器类型,该类型记录分配的数据量并跟踪最大使用量。您还需要考虑对象的大小,因为对于数组而言,由于数组是内置实体,因此实际上并没有分配器。

Here是一个示例:

#include <iostream>
#include <functional>
#include <memory>
#include <map>
#include <unordered_map>
#include <vector>

using namespace std;

static constexpr long total_size = 1000000;

template<typename T>
class CountingAllocator
{
public:
    shared_ptr<size_t> d_max = make_shared<size_t>(0u);
    using value_type = T;
    using pointer = T*;

    CountingAllocator() = default;
    template <typename S>
    CountingAllocator(CountingAllocator<S> const& other): d_max(other.d_max) {}
    size_t size() const { return *d_max; }
    T* allocate(size_t size) {
        size *= sizeof(T);
        *d_max += size;
        return reinterpret_cast<T*>(operator new(size));
    }
    void deallocate(void* ptr, size_t) {
        operator delete(ptr);
    }
    friend bool operator== (CountingAllocator const& c0, CountingAllocator const& c1) {
        return c0.d_max == c1.d_max;
    } 

    friend bool operator!= (CountingAllocator const& c0, CountingAllocator const& c1) {
        return !(c0 == c1);
    }
};

template <typename T>
void size(char const* name) {
    CountingAllocator<typename T::value_type> allocator;
    T m(allocator);
    for (int i = 0; i != total_size; ++i) {
        m[i] = i;
    }
    cout << name << "="  << allocator.size() << "\n";
}

int main() {
    size<map<long, long long, less<int>, CountingAllocator<pair<long const, long long>>>>("map");
    size<unordered_map<long, long long, hash<long>, equal_to<long>, CountingAllocator<pair<long const, long long>>>>("unordered_map");
    cout << "array=" << sizeof(long long[total_size]) << "\n";
    return 0;
}

在ideone上使用clang进行打印(尽管我在这里对齐了尺寸):

map=          48000000
unordered_map=40654880
array=         8000000

当然,数组的占用空间最小(每个元素的开销为零)。我感到惊讶的是,unordered_map的平均每元素开销小于map。除了数据外还使用5个单词似乎有点多余。