std::map 分配是否尽可能静态?

Ben*_*ois 4 c++ memory-management dynamic-memory-allocation

考虑具有相同效果的 3 个版本的代码:

版本1:

int main()  {
    std::map<int,int> x = {{0,0}, {1,1}, {2,2}};
    // Do some stuff...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

版本2:

int main()  {
    std::map<int,int> x;
    x[0] = 0;
    x[1] = 1;
    x[2] = 2;
    // Do some stuff...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

版本3:

int main()  {
    std::map<int,int> x;
    x.insert(std::pair<int,int>(0,0));
    x.insert(std::pair<int,int>(1,1));
    x.insert(std::pair<int,int>(2,2));
    // Do some stuff...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这些代码的效率是多少?

我认为版本 1 是完全静态分配:x分配一次所需的空间并设置值。我还认为版本 3 需要动态分配:每次调用 insert 都会检查该键是否尚未使用,检查插入位置并在分配值之前分配更多空间来映射。对于版本 2,我不确定。你能帮我吗?

And*_*dyG 6

C++ 标准对分配是发生在编译时还是运行时没有要求。所有这些意味着实现可以自由地进行自己的优化(或不进行优化)。

所以正确的做法是进行测试。

此类优化很可能尚未实施。没有 的constexpr构造函数std::map,尽管std::initializer_list您在此处创建的 可能是编译时常量(请注意,此处也没有执行聚合初始化)

std::map<int,int> x = {{0,0}, {1,1}, {2,2}};
Run Code Online (Sandbox Code Playgroud)