allocator
当初始化一个类数组的时候,有什么方法可以减少构造和复制操作呢? 对于一个类Foo,我们的目标是构建其数组形式,并希望尽量减少构造和复制。 常规数组访问方式如下: printf("=================1\n"); 将得到以下输出,构造4次,复制2次,十分普通: =================1 得到以下输出,只构造两次,没有复制,满足需求,但是如果数组很大的话,这种形式明显就不太好了: 移除上述Foo array1[2];的默认构造过程,又可以产生以下的代码: 注意到,我们需要手动调用析构,得到以下输出,构造2次,复制2次,已有所优化了: 通过这个问题,我学习到了placement new(以前可能学习过,但是完全忘记了TAT),使用placement new可以再次优化,直接在给定的内存上构造,其原理如何,我认为这些知识点不是我目前想追求的,所以不做讨论。总之,可以得到以下代码: 得到以下输出,只构造2次,没有复制: 上述placement new方案有点不太美观,特别是reinterpret_cast之处,考虑使用allocator分配,得到以下代码: 同样输出如下,只构造2次,没有复制,不过通过内存地址也可以看出,这是堆上分配的: 以上只是针对今天一个问题的解答,placement new或者allocator是否是更优的答案,我认为具体问题还需要具体分析
在本章,我们学到了在部署ElasticSearch集群时如何选择恰当数量的分片和分片副本;也了解了在索引和搜索过程中routing是如何起作用的;我们也见识了新的shard allocator是如何起作用的,也清楚了如何根据需求来配置它。我们也能够根据需求配置allocation mechanism,也学会了如何使用query execution preference功能来实现在特定的节点上执行特定的操作。最后,我们用相关知识配置了一个真实场景的集群,并且能够依据需求进行扩展 在下一章,我们将更多地关注ElasticSearch的配置选项:我们将学习如何配置内存,如何选择合适的directory
