【发布时间】:2014-05-07 21:18:15
【问题描述】:
我最近了解到,引入 size_t 是为了帮助面向未来的代码防止本机位数增加和可用内存增加。具体的使用定义好像是关于存储某个东西的大小,一般是数组。
我现在一定想知道这种未来的证明应该走多远。如果下一个迭代数组的任务使用unsigned int 作为索引数组,那么使用面向未来和适当大小的 size_t 定义数组长度当然是没有意义的:
void (double* vector, size_t vectorLength) {
for (unsigned int i = 0; i < vectorLength; i++) {
//...
}
}
事实上,在这种情况下,我可能希望严格的语法应该将 unsigned int 上转换为关系运算符的 size_t。
这是否意味着迭代器变量i 应该只是一个size_t?
这是否意味着任何程序中的任何整数都必须在功能上进行标识,以确定它是否会被用作数组索引?
这是否暗示任何使用以编程方式开发索引的逻辑的代码都应该创建一个 size_t 类型的新结果值,特别是如果该逻辑依赖于潜在的有符号整数值?即
double foo[100];
//...
int a = 4;
int b = -10;
int c = 50;
int index = a + b + c;
double d = foo[(size_t)index];
当然,因为我的代码逻辑创建了一个固定的界限,向上转换到 size_t 并没有提供额外的保护。
【问题讨论】:
-
size_t应该是对象的最大可能大小。因此,您可以确定它可以用于索引char的数组,无论该数组有多大。而且,如果您要计算malloc的内存量,请确保不要溢出SIZE_MAX等。 -
在实践中,您不能真正使用索引不适合
ptrdiff_t的数组或向量,因此在这里使用无符号类型来制造问题是没有意义的。除非数组真的有可能变得太大而无法被int索引,否则您应该使用int。 (在很多情况下,这种可能性根本不存在。有时根据定义,有时由于物理限制。)