c++中对映射/集的编译器优化



当输入大小很小时,编译器是否对数据结构进行优化?

unordered_set<int>TmpSet;
TmpSet.insert(1);
TmpSet.insert(2);
TmpSet.insert(3);
...
...

由于它很小,不需要使用哈希,我们可以简单地将其存储在3个变量中。这样的优化会发生吗?如果是,谁负责?

edit:将set替换为unordered_set,因为前者不起作用。

理论上可能用不同的实现完全替换整个数据结构。(只要转义分析能够表明对它的引用不能传递给单独编译的代码(。

但在实践中,您编写的是对构造函数的调用,然后是对模板函数的三次调用,这并不简单。这是编译器看到的全部内容,而不是集合的高级语义。

除非它要优化,否则真正的编译器不会使用具有不同对象表示的不同实现。

如果你想像这样进行微优化,在C++中你应该自己做,例如使用std::bitset<32>和集合位来指示集合成员身份。

这是一个过于复杂的问题,编译器无法可靠地做好工作。此外,如果编译器开始发明具有不同速度/空间权衡的不同数据结构,并且猜测错误并使用不太适合用例的数据结构,那么可能会出现严重的实现质量问题。

程序员有一个合理的期望,他们编译的代码会像他们写的一样工作,至少在大范围内是这样。包括调用那些标准头模板函数及其函数的实现。

也许C++实现有一些适应用例的空间,但我认为这需要很多争论,可能还需要一个特殊的机制来允许它在实践中使用。也许对std::名称的名称识别就足够了,将其作为内建函数而不是标头实现,但目前的实现策略是将C++中的函数写入.h标头中。例如在libstdc++或libc++中。

最新更新