C++ 为什么std::equal_会导致动态分配?

C++ 为什么std::equal_会导致动态分配?,c++,heap-memory,std-pair,C++,Heap Memory,Std Pair,考虑以下简单示例,其中我使用std::equal_to比较两个std::pair。运算符new重载,以便在分配时打印消息(实时代码): 在比较key1和key2时,可以看到有两种分配。但是为什么呢std::equal_to的运算符通过常量引用获取其参数,因此不应进行分配。。。我错过了什么?谢谢。这是因为你复制了这对情侣 keyX的类型是std::paireq有一个用于参数const std::pair&,const std::pair&的函数调用运算符。由于类型不匹配,引用不能直接绑定到参数。但

考虑以下简单示例,其中我使用
std::equal_to
比较两个
std::pair
运算符new
重载,以便在分配时打印消息(实时代码):


在比较
key1
key2
时,可以看到有两种分配。但是为什么呢
std::equal_to
的运算符通过常量引用获取其参数,因此不应进行分配。。。我错过了什么?谢谢。

这是因为你复制了这对情侣

keyX
的类型是
std::pair
eq
有一个用于参数
const std::pair&,const std::pair&
的函数调用运算符。由于类型不匹配,引用不能直接绑定到参数。但是,
int
可以隐式转换为
无符号
,因此给定的对可以隐式转换为参数对

因此,您隐式地为比较创建了一对临时参数。临时字符串的创建会导致内存分配



如果您使用了
std::equal_to
作为比较运算符,它就不会在推断参数类型时创建副本,因此也不会导致转换。

Build flags/compiler命令行?@Yakk AdamNevraumont gcc 8.2.0使用c++17和O2 Optimization同等地强制使用
key1
的类型,通过指定类型而不是依赖于
auto
,或者通过使用
make\u pair
添加,将
key2
设置为
key\u type
,将阻止额外的分配。(在第一种情况下,编译器在转换时足够智能地移动字符串值)。作为C++新手,我可能已经尝试过<代码> STD::均衡器到,这会起作用吗?显然没有省去它那么好。@这也确实可以避免复制,因为在这种情况下,参数类型将匹配成对的类型。
#include <functional>
#include <string>
#include <iostream>

// overloaded to see when heap allocations take place
void* operator new(std::size_t n)
{
    std::cout << "Allocating " << n << std::endl;
    return malloc(n);
}

int main()
{
    using key_type = std::pair<std::string, unsigned>;
    auto key1 = std::make_pair(std::string("a_______long______string______"), 1);
    auto key2 = std::make_pair(std::string("a_______long______string______"), 1);

    std::cout << "Finished initial allocations\n\n" << std::endl;

    std::equal_to<key_type> eq;
    eq(key1, key2); // how can this cause dynamic allocation???
}
Allocating 31
Allocating 31
Finished initial allocations


Allocating 31
Allocating 31