为什么memset
将int
作为第二个参数而不是char
,而wmemset
采用wchar_t
而不是long
}或long long
?
答案 0 :(得分:49)
memset
早于(通过相当多的)函数原型添加到C.如果没有原型,你不能将char
传递给函数 - 当/如果你尝试的话,当你传递它时它会被提升为int
,并且函数接收的是int
。
值得注意的是,在C中,(但不是在C ++中),像'a'
这样的字符文字不的类型为char
- 它的类型为{{1所以你传递的内容通常无论如何都要以int
开头。基本上它是以char开头并获得提升的唯一方法是传递int
变量。
理论上,char
可能会被修改,因此它会收到memset
而不是char
,但是不太可能有任何好处,并且可能会有一些相当不错的可能性代码或其他。有一个未知但可能相当高的成本,几乎没有任何实际利益的机会,我会说它被改变为在“苗条”和“无”之间接受int
下降的可能性。
编辑(回复评论):char
的{{1}}个最低有效位用作写入目标的值。
答案 1 :(得分:7)
可能与 <ctypes.h>
中的ints
而不是chars
中的函数相同的原因。
在大多数平台上,char
太小而无法自动推入堆栈,因此通常会推送最接近机器字长的类型,即int
。
正如@ Gui13评论中指出的那样,这样做也可以提高效果。
答案 2 :(得分:-2)
请参阅fred的回答,这是出于性能原因。
在我这边,我尝试了这段代码:
#include <stdio.h>
#include <string.h>
int main (int argc, const char * argv[])
{
char c = 0x00;
printf("Before: c = 0x%02x\n", c);
memset( &c, 0xABCDEF54, 1);
printf("After: c = 0x%02x\n", c);
return 0;
}
它在64位Mac上给了我这个:
Before: c = 0x00
After: c = 0x54
如您所见,只写入最后一个字节。我想这取决于架构(endianness)。