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是否是更优的答案,我认为具体问题还需要具体分析