【发布时间】:2021-01-08 00:46:12
【问题描述】:
考虑以下代码:
template<typename T, size_t S> struct MyArray {
int length;
T contents_[S];
MyArray() { length = S; }
T& operator[](const int index) {
assert(index >= 0 && index < length);
return contents_[index];
}
int Length() { return length; }
};
从根本上说,没有理由为 S 的每个值创建 Length 函数和下标运算符的单独副本。但我担心实际上每个不同的 S 值都会重复这些函数,从而限制这种方法的用处。
(如果你好奇我为什么不使用 std::vector,那是因为这是一个没有任何基于堆的内存分配的嵌入式应用程序)
【问题讨论】:
-
Length()是否仍等于S?length会员有用吗? -
另外,为了记录,是创建下标运算符的单独副本的原因。
contents_[index]的实现方式因contents_的类型而异(索引算法不同;它取决于底层类型的大小。你不能用一个函数实现来完成所有数组索引)。 -
另外,
Length()可能最终没有代码,无论模板如何。生成的字节码几乎可以肯定只是直接访问length成员。但是对于更复杂的方法,您的问题会成立。 -
在godbolt 中玩了一会儿,似乎(1)在低优化级别,没有进行合并,(2)在高优化级别,无论如何,一切都是微不足道的内联。假设您担心空间问题并启用了优化,那么您似乎没有什么可担心的。