memset这个事情 再多说两句

本文探讨了Linux环境下内存优化的方法,特别是通过改进memset函数实现减少复制和提高效率的技术细节。

接上文:linux编程的108种奇淫巧计-15(减少复制)

最早,我是在一个沙龙活动中提到了这个事情:

这是当时沙龙活动的PPT,很奇怪被人上传到了百度文库:http://wendang.baidu.com/view/2900e1fe910ef12d2af9e786.html

后来我整理了一下放在了我的博客中:

http://blog.youkuaiyun.com/pennyliang/archive/2009/06/15/4271041.aspx

继而,被人挖出放到了水木:

http://www.newsmth.net/bbstcon.php?board=SearchEngineTech&gid=15054

后来我很愤地和好友RoachCock进行了争论,我们各有不完善,不准确的地方。

继而又讨论了一些关于内存优化的问题。

如今在这个帖子里面,已经没有我的发言,因为某个原因,我删除掉了在这个版上发的几乎所有帖子。

在这个例子里面,memset导致低效的主要原因是缺页,另外还有一个就是memset是一个隐性的循环,关于这个消除隐性循环有一个更好的例子,以后给出。当时我就想实现一个更快的memset,但总也不能,至今也没有办法逾越glibc提供的这个memset版本的代码。希望有能力的朋友能帮我解决这个困扰。

正如我的游泳老师说的那样,永远没有标准动作,标准动作不代表最好的动作,每个运动员都是在向最好的动作努力,但没有一个运动员的动作是最好的,当今最好的,也不代表人类历史最好的。

熟悉水木技术版的朋友可能会看到我给的memset代码很眼熟,但发这个代码的账号不是pennyliang,那个账号是我的马甲,呵呵,因此这个是我原创,不是抄来的。

### 3.1 `memset` 函数的基本介绍 `memset` 是 C/C++ 标准库中的一个内存操作函数,用于对一段内存空间进行填充操作。其函数原型为: ```cpp #include <string.h> void *memset(void *s, int ch, size_t n); ``` 该函数的作用是将指针 `s` 所指向的内存区域的前 `n` 个字节全部设置为指定的值 `ch`,其中 `ch` 虽然是 `int` 类型,但实际是将其作为字节处理(即取低 8 位)[^1]。该函数常用于对数组、结构体等进行初始化或清零操作[^3]。 ### 3.2 `memset` 的使用方法 - **初始化数组**:可以用于将数组初始化为特定值,例如 0 或 -1。 - **清零操作**:在使用动态内存分配或结构体前,清空内存以避免垃圾值。 - **字符数组操作**:由于 `memset` 是按字节操作的,因此在处理字符数组时效果最为直观。 ### 3.3 `memset` 使用示例 #### 示例 1:初始化字符数组 ```cpp #include <iostream> #include <cstring> using namespace std; int main() { char str[5]; str[4] = 'q'; // 保留最后一个字符不变 memset(str, 'a', 4); // 前4个字符设置为 'a' for (int i = 0; i < 5; i++) { cout << str[i] << endl; } return 0; } ``` 输出结果为: ``` a a a a q ``` 该示例中,`memset` 将字符数组 `str` 的前 4 个字节设置为 `'a'`,最后一个字符保持 `'q'` 不变[^3]。 #### 示例 2:整型数组初始化 ```cpp #include <iostream> #include <cstring> using namespace std; int main() { int data[10]; memset(data, 0, sizeof(data)); // 正确:初始化为 0 for (int i = 0; i < 10; ++i) { cout << data[i] << " "; } return 0; } ``` 该示例中,`memset` 用于将整型数组 `data` 的所有元素初始化为 0。这种方式在初始化为 0 或 -1 时是安全的,但若试图设置为其他整数值(如 1),则可能导致非预期结果,因为 `memset` 是按字节填充的,不能正确表示整型值[^4]。 ### 3.4 注意事项 - `memset` 操作的是字节级别,因此适用于字符型数据或需要清零的内存块。 - 对于整型数组,仅推荐使用 `0` 或 `-1` 进行初始化,其他数值可能导致错误填充。 - 在使用 `memset` 前应确保内存已正确分配,否则可能导致未定义行为。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值