【发布时间】:2016-09-06 20:22:57
【问题描述】:
我已经用 C++ 编写了一个固定大小的容器(准确地说是环形缓冲区)。目前我在构造函数中设置容器的大小,然后在堆上分配实际的缓冲区。但是,我一直在考虑将 size 参数从构造函数中移到模板中。
从此开始(RingBuffer 拟合 100 个整数)
RingBuffer<int> buffer(size);
到这里
RingBuffer<int, 100> buffer;
据我所知,这将允许我在堆栈上分配整个缓冲区,这比堆分配要快。主要是可读性和可维护性的问题。这些缓冲区通常作为类的成员出现。我必须用一个大小来初始化它们,所以我必须在类的每个构造函数的初始化列表中初始化它们。这意味着如果我想更改 RingBuffer 的容量,我必须记住在每个初始化器列表中更改它,或者使用尴尬的 static const int BUFFER_SIZE = 100; 成员变量。
我的问题是,与在构造函数中相比,将容器大小指定为模板参数有什么缺点吗?两种方法的优缺点是什么?
据我所知,编译器将为每个不同大小的 RingBuffer 生成一个新类型。这可能是相当多的。这对编译时间有很大影响吗?它会膨胀代码还是阻止优化?当然,我知道这在很大程度上取决于具体的用例,但在做出此决定时我需要注意哪些事项?
【问题讨论】:
-
是的,会有膨胀。今天的数兆字节“你好世界!”不会引起明显的膨胀。应用标准。优化可能会更好,但 CPU 缓存利用率可能会受到影响。我怀疑除了尝试和亲眼看到你得到什么之外,是否可以通过任何方式给出明确的答案。 (但如果你这样做了,请务必发布你的结果。)
-
(然后没有人会把你的结果当作确定的事实,并且可能会想自己重复实验。)
-
作为模板参数,不同大小的容器会是不同的类型。这可能是一个优点或一个缺点,这取决于你想如何使用它。
标签: c++ templates containers