社区
C语言
帖子详情
把一个很大很大的数组清零的最快方法是什么?memset()很慢。
z341223318
2008-12-11 12:00:46
数组大小有40多万个字节,直接用memset()置0导致别的任务暂停了一会,有没有更好更快的方法,使在一个任务中对一个很大很大的数组置0对别的任务没有影响。
...全文
4682
85
打赏
收藏
把一个很大很大的数组清零的最快方法是什么?memset()很慢。
数组大小有40多万个字节,直接用memset()置0导致别的任务暂停了一会,有没有更好更快的方法,使在一个任务中对一个很大很大的数组置0对别的任务没有影响。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
85 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ljhhh0123
2011-04-03
打赏
举报
回复
static char buf[400000];
顶25楼!
最快的是不用清0的.因为操作系统已经帮你做了.
40万字节,才400K而已,操作系统能为你分配的.
laoyehu
2011-04-03
打赏
举报
回复
好贴,受教了。
kingstarer
2011-04-03
打赏
举报
回复
哦 是比较久以前的贴
我觉得可能是在其它方面出现问题,现在的计算机执行40w条指针应该很快的
kingstarer
2011-04-03
打赏
举报
回复
直接用memset()置0导致别的任务暂停了一会
===============
人能感觉出来的暂停? 那你考虑一下换机器吧
我这边memset一M的数据都没感觉
freefei
2011-04-03
打赏
举报
回复
[Quote=引用 82 楼 bokutake 的回复:]
#79楼……操作系统虽然能够在分配时清零,比如new函数调用的HeapAlloc()可以加ZERO的参数,但是那个功能C语言并没有使用,所以分配到的变量都是随机值。
[/Quote]
难道c语言调用系统调用,内存都是有操作系统分配的
freefei
2011-04-03
打赏
举报
回复
[Quote=引用 17 楼 tnfyj 的回复:]
40多万个字节用一个数组....
何必呢...
这样不光是你清空的时候慢吧...
遍历呢?查找呢?随机访问呢? 都会很慢的...
不要试图用优化的技术来掩盖拙劣的设计...
[/Quote]
感觉楼主的设计有问题,分配4M一次
干什么用呢?
Srulos
2011-04-03
打赏
举报
回复
0 0好多人阿,,有点饿了,
辰岡墨竹
2011-04-03
打赏
举报
回复
#79楼……操作系统虽然能够在分配时清零,比如new函数调用的HeapAlloc()可以加ZERO的参数,但是那个功能C语言并没有使用,所以分配到的变量都是随机值。
super_admi
2011-04-03
打赏
举报
回复
最快的方法,应该是不操作。需要的时候,直接覆盖掉。
pathuang68
2011-04-03
打赏
举报
回复
你们继续讨论,俺旁观。最近一段时间用Java写代码的机会更多些...
666233
2011-04-02
打赏
举报
回复
mark..
辰岡墨竹
2011-04-02
打赏
举报
回复
关闭电源……哪位,RAM上电后会变成随机值的……不是0。
memset是按字节操作的,不过其内部优化应该尽可能以rep movsd一次32个字节之类的方式实现的吧。MOVQ之类的MMX指令甚至SSE指令应该能更快一些。
数组轮换配合多线程的话是好主意。如果把内存块分割成整块大小,比如4KB。然后根据程序下一步的需求试试清零,并且建立位图表,程序访问哪块后设置上脏标志。
当然最终极的方法是在Ring0级修改GDT和LDT,将整个内存池的所有页面都指向同一个内存物理页面,这样只需要清空一个4KB内存区域就可以了,把这些页面设置为只读,当试图写入时会触发保护模式异常,然后在异常处理里分配新页面并清零——(写时复制)。
snake_xiongyang
2011-04-02
打赏
举报
回复
这个帖子好
楼上有人提到了两个数组轮换 再配合另外开一个线程的方法 可以应对这个设计缺陷
当然鄙视一下楼主的结贴率,都是啥人啊
学习了
luciferisnotsatan
2011-04-02
打赏
举报
回复
谁挖的坟
另外,鄙视下lz的结贴率。200多帖子才结了22个
赵4老师
2011-04-02
打赏
举报
回复
关闭电源!嘿嘿!低电平(0V)据说就是0
赵4老师
2011-04-02
打赏
举报
回复
SIMD指令?
jjboy2010
2011-04-02
打赏
举报
回复
个人拙见 先 与 再移位。 char a[5万】; unsigned long a = 0;
p[0] && a << 1万 。 此方法需要先判断 CPU 是 大端 还是小端。
独酌逸醉
2010-05-06
打赏
举报
回复
[Quote=引用 18 楼 zedzhao 的回复:]
先delete 再new
呵呵~~~
[/Quote]
对,我也这么想的。
阿磊2013
2010-05-06
打赏
举报
回复
18楼的好猛
mymtom
2010-05-06
打赏
举报
回复
[Quote=引用楼主 z341223318 的回复:]
数组大小有40多万个字节,直接用memset()置0导致别的任务暂停了一会,有没有更好更快的方法,使在一个任务中对一个很大很大的数组置0对别的任务没有影响。
[/Quote]
在程序的初始化阶段清零,慢一点也没有什么影响。
在程序的运行过程中频繁地对这么大的数组清零,只能说是设计上的缺陷。
加载更多回复(67)
memset
库函数
memset
的更有效版本实现 有参考其他的 一、实验预备知识 (1)库函数
memset
简介:
memset
函数作用:将从 s 开始的 n 个字节的内存区域全都填充为 c 的低位字节。它是对较大的结构体或
数组
进行
清零
操作的一种
最快
方法
。 (2)库函数
memset
的最直接实现: /* Basic implementation of meset */ void *basic_
memset
(void *s, int c, size_t n) { size_t cnt = 0; unsigned
memset
初始化结构体之内存泄漏
void *
memset
(void *str, int c, size_t n) 复制字符 c(
一个
无符号字符)到参数 str 所指向的字符串的前 n 个字符。 str – 指向要填充的内存块。 c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。 n – 要被设置为该值的字节数。 声明:在花括号中间,每个结构代表
一个
作用域,可以防止命名冲突, str...
LeetCode
数组
高频题目整理
1.两数之和(0.479) 题目描述 给定
一个
整数
数组
nums 和
一个
目标值 target,请你在该
数组
中找出和为目标值的那 两个 整数,并返回他们的
数组
下标。 你可以假设每种输入只会对应
一个
答案。但是,
数组
中同
一个
元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解题思路 暴力解法,遍历两次,注意题中要求,
一个
数只能用一次,所以,第二次遍历的时候注意j!=i。
LeetCode—
数组
与字符串—编程笔记
出于找工作的需要,最近一周开始刷题了,经同学推荐发现了
一个
比较好的刷题网站LeetCode,最近把其中的
数组
与字符串栏的题目刷完了,这里进行
一个
总结,以将自己的劳动沉淀成自己的知识体系。 说明:由于自己水平有限,只是对C语言比较熟练,因此刷题的过程中全部采用的是C语言来实现。 说明:对于
数组
和字符串的基本理论知识不再做讲解,本篇文章主要记录在进行
数组
、字符串、二维
数组
的处理时常用的算法和思路。 总共有以下几个题目(以下所有题目来源都来源于LeetCode,这里统一对题目转载进行说明,后续在出现题目时就不再进
C++
● .请你说一下
数组
和指针的区别 参考回答:
数组
:
数组
是用于储存多个相同类型数据的集合。 指针:指针相当于
一个
变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。 区别: • 赋值:同类型指针变量可以相互赋值,
数组
不行,只能
一个
一个
元素的赋值或拷贝 • 存储方式:
数组
:
数组
在内存中是连续存放的,开辟一块连续的内存空间。多维
数组
在内存中是按照一维
数组
存储的,只是在逻辑上是多...
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章