将off_t用于非字节偏移是否合适?

时间:2013-07-15 07:47:53

标签: c++ c types semantics offset

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

是否合理
float foo(float* a, off_t offset);

为了它?或off_t仅与字节中的偏移相关,而不是与aribtrary元素大小的指针算法?即当偏移量为a[offset]时,说off_t是否合理?

GNU C Library Reference Manual说:

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

但这并不能说明我的意思。

我的直觉是答案是“否”,因为[offset]中使用的实际地址是+ sizeof(float)* offset的地址,所以“sizeof(float)* offset”是{{ 1}}和sizeof(float)是off_t,两者都是带'尺寸'的常量。

注意:偏移可能是负数。

4 个答案:

答案 0 :(得分:2)

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

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

在实践中,您甚至可以使用intunsigned,除非您认为您的阵列可能包含数十亿个组件。

您可能希望#include <stdint.h>(或<cstdint>使用最新的C ++),并为索引显式调整类型int32_t

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

  typedef unsigned index_t; 

以后使用它,例如

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

我的意见是你应该使用int作为索引的类型。 (但适当地处理越界索引)。

答案 1 :(得分:2)

你有没有什么理由不使用int?就是这样 C ++中的整数值的默认类型,应该使用 除非有充分理由不这样做。

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

答案 2 :(得分:1)

我认为这是不合适的,因为

  1. off_t(用于表示文件大小)
  2. off_t是签名类型。
  3. 我会选择size_type(通常是size_t的“typedef”名称),这是std容器使用的名称。

答案 3 :(得分:0)

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

  • 可以是否定的;
  • 暗示区别不是以字节为单位,而是以任意大小为单位,具体取决于元素类型。

您怎么看?