操作内存时是否需要乘以sizeof(char)?

当使用malloc并进行类似的内存操作时,我可以依赖sizeof(char)始终为1吗?

例如,我需要为char类型的N个元素分配内存。 是否需要乘以sizeof( char )

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

或者我可以依赖sizeof(char)始终为1并且只是跳过乘法

 char* buffer = malloc( N ); 

我完全理解在编译期间评估sizeof然后编译器甚至可以编译出乘法,因此性能损失将是最小的并且很可能为零。

我主要询问代码清晰度和可移植性。 char类型是否需要这种乘法?

虽然没有必要,但我认为留下sizeof(char)是一种好习惯,因为它使代码更具可读性并避免使用幻数。 此外,如果稍后需要更改代码,那么代替char而不是将某个东西的大小拼接成该对象的指针,那么更改代码比仅使用“1”更容易。

根据定义,sizeof(char)总是等于1.一个字节是C中字符的大小,无论字节中的位数是多少(在普通桌面CPU上为8)。

一个字节不是8位的典型示例是PDP-10和其他具有9/36位字节的旧的,类似于微型计算机的架构。 但是我认为,不是2 ^ N的字节变得非常罕见

另外,我认为这是更好的风格:

 char* buf1; double* buf2; buf1 = malloc(sizeof(*buf1) * N); buf2 = malloc(sizeof(*buf2) * N); 

因为它适用于指针类型。

无论你做什么类型的内存操作, sizeof(char)总是1。

但是, sizeof(TCHAR)可能会因您的编译器选项而异。

我认为这是一种反模式 。 它表明程序员并不完全知道他/她在做什么,这会立即将其余的代码转换成可疑的光。

当然,它不是(引用维基百科)“无效”,但我发现它“远非最佳”。 它在运行时没有花费任何成本,但它会使代码混乱不必要的垃圾,同时表明有人认为有必要。

另请注意,表达式不会解析为函数调用: sizeof不是函数。 你没有调用一个函数传递它的神奇符号char 。 您将内置的一元前缀运算符sizeof应用于表达式,并且您的表达式在这种情况下是对char类型的char ,在C中将其写为(char)

完全可能,并且强烈建议尽可能在其他表达式上使用sizeof ,然后它将产生表达式值的大小:

 char a; printf("A char's size is %u\n", (unsigned int) sizeof a); 

这将始终在所有符合C的实现上打印1

我也非常赞同David Cournapeau并考虑在malloc() call中重复类型名称 也是一种反模式。

代替

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

许多人会写,以分配一个N字符容量字符串缓冲区,我会去

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

或者(仅限字符串)省略上面的sizeof ,但这当然更通用,并且适用于任何类型的指针。

没有必要。 见这里 (例如)。

sizeof(char)由C标准定义为始终为1 (字节)。 请注意,因为sizeof返回多个字节,所以每个字节的位数无关紧要(实际上,无论如何都是8)。

要记住的其他事情是编译器静态地知道sizeof(char)的值是1并且它也知道将数字乘以静态1意味着不需要进行乘法; 编译器会优化它。 对表现的担忧不应以这些理由加以考虑。

来自“新C标准。经济文化评论”。

  1. 统计:sizeof的2.0%来自char ,1.5%来自unsigned char 。 在1.2版本的书中的页1033。
  2. 第1037页。

字符类型表示中的位数无关紧要。 根据定义,字节类型中的字节数为1。

编码指南开发人员有时会将字节关联,始终包含8位。 在字符类型为16位的主机上,这可能导致错误的假设,即将sizeof应用于字符类型将返回值2.这些问题将在别处讨论。

使用sizeof(char)可以使代码更具可读性和可移植性。

在x86上,我们都知道一个字符是1个字节。 但明确写下来有助于使你的意图更清晰,这总是一件好事。

此外,如果您的代码放在一个字符不是1字节的其他平台上,该怎么办? 如果一个角色只有4位而该怎么办?

同意,这没有必要,但它不会减慢您的运行时间,并且在极少数情况下您需要将代码移植到不同的架构中才能获得回报。