0

假设我正在编写一个函数,该函数将一个float a[]和一个偏移量写入此数组,并返回该偏移量处的元素。使用签名是否合理

float foo(float* a, off_t offset);

为了它?还是off_t仅与字节偏移有关,而不是与任意元素大小的指针算术有关?a[offset]即当偏移量是类型时说它是合理的off_t吗?

GNU C 库参考手册说:

off_t
     This is a signed integer type used to represent file sizes. 

但这并不能告诉我太多。

我的直觉是答案是否定的,因为 a[offset] 中使用的实际地址是 a + sizeof(float) * offset 的地址,所以 "sizeof(float) * offset" 是 an off_t,而 sizeof(float ) 是 a size_t,并且两者都是具有“维度”的常数。

注意:偏移量可能为负数。

4

4 回答 4

2

您可以使用size_torptrdiff_t作为索引的类型(您的第二个参数更多的是浮点数组中的索引而不是偏移量)。

您的使用是索引,而不是偏移量。请注意,标准的offsetof宏被定义为返回字节偏移量!

在实践中,您甚至可以使用intor unsigned,除非您相信您的阵列可能包含数十亿个组件。

您可能想要#include <stdint.h>(或<cstdint>使用最近的 C++)并具有明确大小的类型,例如int32_t您的索引。

出于源代码可读性的原因,您可以定义

  typedef unsigned index_t; 

然后使用它,例如

  float foo(float a[], index_t i); 

我的意见是,您应该将int其用作索引的类型。(但适当处理越界索引)。

于 2013-07-15T07:50:55.973 回答
2

你有什么好的理由不使用int吗?它是 C++ 中整数值的默认类型,除非有充分的理由不使用,否则应该使用它。

当然,一个很好的理由可能是它可能会溢出。如果上下文是这样的,您最终可能会得到非常大的数组,您可能想要使用ptrdiff_t,它被定义为(在 C 和 C++ 中)作为两个指针相减产生的类型:换句话说,保证不会大小大于 1 的所有类型溢出(用作偏移量时)。

于 2013-07-15T08:09:14.260 回答
1

我会说这是不合适的,因为

  1. off_t是(打算)用于表示文件大小
  2. off_t是有符号类型。

我会选择size_type(通常是“typedef”ed 名称size_t),这是 std 容器使用的名称。

于 2013-07-15T07:51:27.003 回答
0

也许答案是使用ptrdiff_t?它...

  • 可以是负数;
  • 暗示差异不是字节,而是取决于元素类型的任意大小的单位。

你怎么看?

于 2013-07-15T08:02:02.890 回答