You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在支持多字节的memset替代方法?如何填充整数值至数组?

多字节值的数组批量赋值方案(替代memset)

针对你需要将单个int16/int32值广播到整个数组的需求,以下是几种实用方案:

一、最通用:手动循环赋值

这是兼容性拉满的方法,无需依赖任何编译器扩展或特殊库,代码直观易懂。现代编译器会自动对循环做优化(比如循环展开、SIMD指令),性能并不会比专用函数差太多。

示例代码:

#include <stdint.h>

// 给int32数组批量赋值
int32_t arr32[100];
int32_t val32 = 0x12345678;
for (size_t i = 0; i < sizeof(arr32)/sizeof(arr32[0]); i++) {
    arr32[i] = val32;
}

// 给int16数组批量赋值
int16_t arr16[200];
int16_t val16 = 0x1234;
for (size_t i = 0; i < sizeof(arr16)/sizeof(arr16[0]); i++) {
    arr16[i] = val16;
}

二、编译器内置高效函数(性能优先)

不同编译器提供了专门处理多字节批量赋值的内置函数,能直接生成最优机器指令(如SIMD),但平台依赖较强:

GCC/Clang 系列

使用__builtin_memset_patternX系列函数,X对应目标类型的字节数(2对应int16,4对应int32):

// int32数组赋值,第三个参数为数组总字节数
__builtin_memset_pattern4(arr32, &val32, sizeof(arr32));

// int16数组赋值,第三个参数为数组总字节数
__builtin_memset_pattern2(arr16, &val16, sizeof(arr16));

MSVC 系列

MSVC直接提供memset16和memset32函数,第三个参数为数组的元素个数:

#include <string.h>

// int32数组赋值
memset32(arr32, val32, sizeof(arr32)/sizeof(int32_t));

// int16数组赋值
memset16(arr16, val16, sizeof(arr16)/sizeof(int16_t));

三、利用memcpy实现批量复制(兼容且高效)

通过"翻倍复制"的思路,先设置第一个元素,再不断将已赋值区域复制到未赋值区域,借助memcpy的优化逻辑实现高效赋值,适合跨平台场景:

#include <stdint.h>
#include <string.h>

void fill_int32(int32_t* arr, size_t len, int32_t val) {
    if (len == 0) return;
    arr[0] = val;
    size_t copied = 1;
    while (copied < len) {
        size_t copy_size = (copied <= len - copied) ? copied : len - copied;
        memcpy(arr + copied, arr, copy_size * sizeof(int32_t));
        copied += copy_size;
    }
}

// 使用示例
int32_t arr32[100];
fill_int32(arr32, 100, 0x12345678);

内容的提问来源于stack exchange,提问作者M.kazem Akhgary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:00:56