fir*_*rda 11 c++ containers stl allocator c++11
在你阅读之前: const_reference是typedef,不需要const T&像你看到的那样std::vector<bool>::const_reference = bool.请在阅读其他内容时牢记这一点,以便正确理解它(如值得一提的,这对很多人来说很难).
我想将STL容器用于简单类型(例如int)并发现它们使用次优的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); }}
Run Code Online (Sandbox Code Playgroud)
最终用法将是这样的:
typedef void (*action_t)(void*,int);
extern "C" void work(void *, action_t);
work(&vect, (action_t)&vect::push_back);
Run Code Online (Sandbox Code Playgroud)
(注意:忽略以前代码块中可能存在的转换问题,希望你有这个想法.)
编辑: 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具有可配置类型的参数(通过模板意味着容器类型,如allocator模板参数),那么它可以让您感觉良好.
例如,通过使用与allocator模板参数相同的方法,可以提供所需的功能,可以使用typename指定"push back"参数中使用的类型.
但它不是那样设计的,因为它似乎是一种复杂性,根本不值得.由于编译器优化会消除基本类型的大量开销,因此不值得,因为静态分析更容易在基本类型上运行.
其次,通过引用传递int与在方法参数中复制它的"丢失时间"被认为是平台特异性,无法在"虚拟机"级别(语言编写者必须自己放置的级别)进行验证).更不用说这里的"过早优化"会导致代码膨胀的明显变化,作为一般目的的合理权衡,它被彻底驱逐.这也是因为在设计时,您会想到基本类型,如稀有性和可能包含的可能类型的无穷大.
ps:最后,使用typedef作为分配器的一部分似乎是一个非常糟糕的责任分离,拥有自己的模板参数似乎更清晰,因为它与分配无关,而是与特定方法的实现选择有关容器.
PS2 /编辑:我想补充,如评论说,那vector<bool>::const_reference不能当作什么可以做一个例子,因为它是在标准的错误,实际上是对STL侵权的要求,一个容器定义..::reference为T&.该问题的进一步证明是vector<bool>::reference(非const)不是bool,它是一个未指定的类(_Bit_reference在gcc中),用作访问和变量的代理,包含在向量中,用作存储支持对于"虚拟"bool值,使其看起来像现有的那样.这些奇怪的东西不能移植到通用向量,因为它们不符合宽STL要求.但它并没有使正交方法无效,就像我提到的pass_for_copy_param_type那样,它可以是一个可参数化的新typedef,并且在今天编写"const value_type&"的某些地方(合适的地方)被替换.但这正是我之前提到的代码膨胀.我相信这么少的人肯定不值这么多.
| 归档时间: |
|
| 查看次数: |
1760 次 |
| 最近记录: |