memset()
非常快,因为它内部受益于stosb
操作码。是否存在16位和32位值的函数,这些函数类似地有效地受益于stosb
,stosw
和/或stosd
?
wmemset()
不可移植,对16位值没有帮助。
标准C中没有这样的功能,但根据您要做的事情,可能会有一些特定于CPU的SIMD“内部函数”,您可以使用它来构建一个。你提到stosb
让我觉得你正在使用x86,所以请查看各种*mmintrin.h
标题及其提供的功能的文档。
是的它有很多种。
例如
void *memset16(void *m, uint16_t val, size_t count)
{
uint16_t *buf = m;
while(count--) *buf++ = val;
return m;
}
void *memset32(void *m, uint32_t val, size_t count)
{
uint32_t *buf = m;
while(count--) *buf++ = val;
return m;
}
void *memsetXX(void *m, void *val, size_t size, size_t count)
{
char *buf = m;
while(count--)
{
memcpy(buf, val, size);
buf += size;
}
return m;
}
更安全的版本:
void *memset16safe(void *m, uint16_t val, size_t count)
{
char *buf = m;
union
{
uint8_t d8[2];
uint16_t d16;
}u16 = {.d16 = val};
while(count--)
{
*buf++ = u16.d8[0];
*buf++ = u16.d8[1];
}
return m;
}
void *memset32(void *m, uint32_t val, size_t count)
{
char *buf = m;
union
{
uint8_t d8[4];
uint32_t d32;
}u32 = {.d32 = val};
while(count--)
{
*buf++ = u32.d8[0];
*buf++ = u32.d8[1];
*buf++ = u32.d8[2];
*buf++ = u32.d8[3];
}
return m;
}