是否存在用于16位和/或32位值的memset()函数?

问题描述 投票:1回答:2

memset()非常快,因为它内部受益于stosb操作码。是否存在16位和32位值的函数,这些函数类似地有效地受益于stosbstosw和/或stosd

wmemset()不可移植,对16位值没有帮助。

c memset
2个回答
3
投票

标准C中没有这样的功能,但根据您要做的事情,可能会有一些特定于CPU的SIMD“内部函数”,您可以使用它来构建一个。你提到stosb让我觉得你正在使用x86,所以请查看各种*mmintrin.h标题及其提供的功能的文档。


0
投票

是的它有很多种。

例如

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.