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