【问题标题】:difference(s) between size_t and sizeofsize_t 和 sizeof 之间的差异
【发布时间】:2011-05-27 12:44:40
【问题描述】:

两者有什么区别,

malloc ( sizeof ( char ) * N ) 

size_t datalen = N 
malloc ( datalen  ) 

我们应该在哪里使用size_t 而不是sizeof ( char ),反之亦然?

size_tsizeof ( char ) 之间有性能差异吗?

【问题讨论】:

  • 区别:sizeof(char) 始终为一。 size_t 是一种类型。
  • sizeof(char) 是获取具有size_t 类型的1 的一种蹩脚方式...
  • @R..sizeof(char) 不是获得 1 的蹩脚方式。我不知道字符超过 1 个字节的系统,但 int 数据类型就是这种情况增加了代码的可移植性。此外,编写此程序会增加程序的通用性(为int 而不是为char 这样做可能看起来很奇怪)
  • sizeof定义char 为单位。因此sizeof(char) 本质上是 1。这就像问“一米有多少米?”

标签: c performance


【解决方案1】:

size_t 是一种无符号整数类型,保证支持您使用的平台的最长对象。它也是 sizeof 运算符的结果。
sizeof 返回类型的大小(以字节为单位)。
因此,在这两种情况下,您都将size_t 传递给malloc

【讨论】:

    【解决方案2】:

    它实际上并没有返回 size_t 类型的值,因为 size_t 本身不是具体类型,而是未指定的内置类型的 typedef。 Typedef 标识符(例如 size_t)完全等同于它们各自的底层类型(并在编译时转换为)。如果 size_t 在您的平台上定义为 unsigned int,则 sizeof 在您的系统上编译时返回一个 unsigned int。 size_t 只是维护可移植性的一种便捷方式,如果您明确地按名称使用它,则只需将其包含在 stddef.h 中。

    这个答案是this answer的副本;它最初是由用户 Volte 编写的。

    【讨论】:

      【解决方案3】:

      这就像询问文字 42 和类型 int 之间是否存在性能差异;它们是不同的东西。

      您使用sizeof(T) 来获取 T 对象使用的字节数。这主要用于malloc/calloc/realloc

      您使用size_t 作为存储该号码的类型。

      size_t datalen = N * sizeof(char);
      char* pBuf = malloc(datalen);
      

      【讨论】:

        【解决方案4】:

        在您的示例中,有用性既不是特别明显也不是令人信服,而且问题和代码存在缺陷 - 如果要更改类型怎么办? datalen = N 的大小不够。有一个更好的成语可以更好地利用 sizeof; sizeof(char) 毫无意义,因为根据定义它是 1(尽管 CHAR_BIT 不必是 8)

        如果动态数组的数据类型发生变化,并且您以 sizeof(object) 块而不是 sizeof(type) 块进行分配,那么您的代码将变得更易于维护。

        例如

        char* data = malloc(sizeof(*data) * N ) ;
        

        如果你后来决定 data 应该是 int ,那么:

        int* data = malloc(sizeof(*data) * N ) ;
        

        只有一个变化而不是两个(或者在其他需要尺寸的地方更多)。这对于结构和用户定义的类型特别有用:

        tSomeType* data = malloc(sizeof(*data) * N ) ;
        

        您可能会通过添加或删除成员来更改类型的大小。

        【讨论】:

          猜你喜欢
          • 2020-05-06
          • 1970-01-01
          • 2019-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-13
          • 2013-09-19
          相关资源
          最近更新 更多