size_t和sizeof之间的差异

时间:2010-12-18 10:14:20

标签: c performance

有什么区别,

malloc ( sizeof ( char ) * N ) 

size_t datalen = N 
malloc ( datalen  ) 

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

size_tsizeof ( char )之间是否存在性能差异?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

此答案是this answer的副本;它最初由用户Volte撰写。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

在你的例子中,有用性既不是特别明显也不引人注目,问题和代码是有缺陷的 - 如果类型要改变怎么办? datalen = N的大小不合适。有一个更好的习语,可以更好地利用sizeof; sizeof(char)是没有意义的,因为根据定义,它是1(尽管CHAR_BIT不必是8)

如果要更改动态数组的数据类型,并且您使用sizeof(object)而不是sizeof(type)块进行分配,那么您的代码将变得更容易维护。

e.g。

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

然后如果你以后决定数据应该是int例如:

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

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

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

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