【发布时间】:2020-12-25 06:56:20
【问题描述】:
在下面的示例中,我是否为大小和循环索引选择了正确的类型。似乎有很多选择,int 似乎出现在大多数临时示例中。什么是我的简单示例使用的规范/最佳实践/正确类型。我选择了size_t,因为它代表行/列矩阵大小,ptrdiff_t 代表索引,因为它涉及指针运算。
template<size_t N, size_t P, size_t M>
void naive_multiply(T* A, T* B, T* C) {
for(ptrdiff_t i=0; i!=N; ++i) {
for(ptrdiff_t j=0; j!=M; ++j) {
for(ptrdiff_t k=0; k!=P; ++k) {
C[i + j*M] += A[i + k*P] * B[k + j*M];
}
}
}
};
我对上述内容的唯一保留是隐式类型转换,但是,我可能不知道它们是彼此的别名(如果它们是的话)。我还考虑将uint_ptr_t 用作循环索引。
【问题讨论】:
-
您的容器可能有一个用于“size_type”和“difference_type”的 typedef,或者如果您只是使用原始数组,这会引发一些运行时与编译时的问题,但您当前的选择似乎是合理的对于那些类型。 (基于意见)
-
您的索引不涉及指针运算。在提供的示例代码中,除了索引本身之外,您绝不会对指针进行算术运算。而且您当然没有进行需要支持有符号值的指针算术。有关详细信息,请参阅我的答案。