std::vector<bool>::const_reference = bool
看到的那样.请留意阅读其余的内容,以正确理解(正如在委托中所建议的,这对许多人来说很难).
我想为简单类型(例如int)使用STL容器,并发现它们使用次优的const T& “反模式” – 它适用于大班,但是对于简单/基本类型而言,如果没有内联,则会考虑嵌入式系统.在ARM / ATSAM4L上,实例化.
问题是:为什么例如由于C 11,vector :: push_back重新设计了(const value_type&)的参数,而不是(Allocator :: const_reference)
通用allocator
应该是一样的,但另一种方式可以帮助我为基本类型编写一个自定义分配器(或模板专门化),这些基本类型将定义类型本身的const_reference(参见vector<bool>::const_reference = bool
).
问题2:有适配器类可以为我做吗?
这样的事情
template<class T,class base = std::vector<T> > class myvect: protected base { public: typedef T const_reference; void push_back(const_reference value) { base::push_back(value); }}
最终用法如下:
typedef void (*action_t)(void*,int); extern "C" void work(void *,action_t); work(&vect,(action_t)&vect::push_back);
(注意:忽略以前的代码块中的可能的投射问题,希望你能得到这个想法)
编辑:vector :: const_reference直接定义为const value_type&但在我看来应该被定义为Alloc :: const_reference,然后可以很容易地改变(vector< int,MyAllocator< int>>). (这在C 11中改变,它被定义为Alloc :: const_reference,但现在是const value_type&)
编辑:func(const T&)有时在stackoverflow中被描述为“反模式”,因为它对于没有内联的基本类型是次优的(是的,编译器生成最佳代码,即使是func(const int&),如果它被内联,但这里是IF.func(int)会做更好的工作)
结论:这个问题似乎在const的行为,因此const T& const不是真的意思不会改变,但不改变,因此const T&需要(并且被很好地定义和使用)作为许多方法的返回类型.创建自定义适配器类似乎是优化的最佳方式,似乎被广泛接受,std :: vector< bool>是奇数异常,应该在单独的类(例如dynamic_bitset
)中.
解决方法
你想要的功能,重写:
你想要在某些方法中避免“通过const引用”成语,以避免指针操作对于小型类型而不是直接复制造成的“减速”.对于push_back来说,如果push_back具有可配置类型的参数(通过模板意味着容器类型,就像分配器模板参数),那么这可能会让您感觉良好.
可以通过使用与分配器模板参数相同的方法来绝对地提供您想要的功能,可以使用一个typename来指定在“推回”参数中使用什么类型的类型.
但是这并不是这样设计的,因为它似乎是一种复杂性,这根本不值得.
这是不值得的,因为编译器优化将会排除大量基础类型的开销,因为静态分析在基本类型上更容易运行.
其次,通过引用传递int而不是在方法参数中复制的“丢失的时间”被认为是一个平台特异性,不能在“虚拟机”级别(语言作者必须放置自己的层面) ).更何况这里的“过早优化”将导致一个坦率的代码膨胀来获得,作为一般目的的一个合理的权衡,它被完全驱逐.这也是因为在设计时,您可以考虑基本类型,如稀有度与可能包含的可能类型的无穷大.
PS:
最后,使用typedef作为分配器的一部分,似乎是一个非常糟糕的责任分离,拥有自己的模板参数看起来更清洁,因为它与分配无关,而是与实现方法的实现选择有关容器.
PS2 /编辑:正如在评论中所说,我想补充说,向量< bool> :: const_reference不能被视为可能做的一个例子,因为这是标准中的错误,实际上是对STL的侵犯要求容器将.. :: reference作为T&问题的进一步证明是向量< bool> :: reference(not const)不是bool,它是一个未指定的类(gcc中的_Bit_reference),用作访问和突变的一个位的代理,包含在向量中,作为“虚拟”布尔值的存储支持,使其显现为现有的.这些怪物不能被移植到通用矢量,因为它们不符合广泛的STL要求.但是它不会使正交方法无效,就像我提到的pass_for_copy_param_type可能是一个可参数化的新的typedef,并且在某些地方(适用)中被替换,其中“const value_type&”是今天写的但这正是我之前提到的代码膨胀.我相信绝对不值得这么多.