[英]Why does memset take an int instead of a char?
為什么memset
接受int
作為第二個參數而不是char
,而wmemset
接受wchar_t
而不是long
或long long
呢?
memset
早於(在很大程度上)向C語言添加了函數原型。沒有原型, 就無法將char
傳遞給函數-如果/如果嘗試,將在傳遞給char
時將其提升為int
,函數接收的是一個int
。
另外值得一提的是,C,(但不是在C ++)字面像一個字符'a'
沒有類型char
-它的類型是int
,所以你通過什么通常會開始作為一個int
反正。 本質上,將其作為char開始並得到提升的唯一方法是傳遞char
變量。
從理論上講, memset
可能會被修改,以便它接收一個char
而不是一個int
,但是幾乎沒有任何好處,並且破壞了一些舊代碼或其他代碼的可能性相當大。 我想說,雖然成本未知,但可能相當高,幾乎沒有任何實際收益的機會,所以改變它以接收char
的機會char
介於“苗條”和“無”之間。
編輯(響應注釋): int
的CHAR_BIT
最低有效位用作寫入目標的值。
<ctypes.h>
的函數采用
ints
而不是
chars
可能原因相同。
在大多數平台上, char
太小而無法單獨推入堆棧,因此通常推入最接近機器字長的類型,即int
。
正如@ Gui13的注釋中的鏈接所指出的那樣,這樣做還可以提高性能。
請參閱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
如您所見,只有最后一個字節被寫入。 我猜這取決於體系結構(字節序)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.