是否存在支持多字节的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
相关产品推荐
相关产品推荐

