Mad*_*adH 9 c++ hash performance qt reference
与std :: map和std :: hash_map不同,Qt中的相应版本无需返回引用.如果我为相当庞大的类构建一个哈希值,这不是很低效吗?
编辑
特别是因为有一个单独的方法value(),然后可以按值返回它.
Mar*_*utz 29
STL容器的const下标运算符可以返回引用到const,因为它们使用容器中不存在的索引来拒绝对它的调用.在这种情况下的行为是不确定的.因此,作为明智的设计选择,std::map甚至不提供const下标运算符重载.
QMap试图更容易调整,提供const下标操作符重载作为语法糖,遇到问题与不存在的键,再次尝试更容易,并返回默认构造的值.
如果你想保持STL的收益按常量引用约定,你需要分配一个静态值,并返回到基准是.然而,这与提供的重入保证完全不一致QMap,因此唯一的选择是按价值返回.在const有就是糖衣,以防止一些愚蠢的错误,就像constmap["foo"]++从编译.
也就是说,通过引用返回并不总是最有效的方式.如果你返回一个基本类型,或者更积极的优化,当sizeof(T)<=sizeof(void*)返回值经常使编译器直接将结果返回寄存器而不是间接(地址导致寄存器)或者天堂禁止堆栈时.
另一个原因(除了过早pessimisation)更喜欢通过噪声const的引用,切片,在这里不适用,因为这两个std::map和QMap是价值为基础,因此是均匀的.对于异构容器,您需要保持指针,指针是基本类型(当然除了智能类型).
总而言之,我几乎从未在Qt中使用const下标运算符.是的,它的语法比find()+ 更好*it,但总是会在const下标运算符前面调用count()/ contains()调用,这意味着你要进行两次二进制搜索.而且那么你不会注意到在返回值的性能差异微乎其微反正:)
对于value() const,不过,我认为,它应该返回引用给const,默认为引用到默认值被传递作为第二个参数,但我猜的Qt开发人员觉得这是太多神奇.
operator[]由于 Martin B 所说的原因,QMap 和 QHash 的文档特别指出要避免查找。
如果您想要 const 引用,请使用const_iterator find ( const Key & key ) constwhere 您可以使用以下任何一个:
const Key & key () const
const T & value () const
const T & operator* () const
const T * operator-> () const
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5325 次 |
| 最近记录: |