栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

{0}花括号清零 VS memset清零

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

{0}花括号清零 VS memset清零

这里写自定义目录标题
  • 结论
  • 为什么呢?
  • 补充

{0}花括号清零 VS memset(dst, 0 , sizeof(dst_type))清零

============================================================

结论

在对C语言一个结构体或一块连续内存清零时,如果是在编译时,就可以确定下来类型和大小的内存区域,特别是小块内存,无疑用**{0}花括号清零**,将目标内存清零是最可取的!

为什么呢?
  • 美学角度

char dst[256] = {0};

VS

char dst[256];
memset(dst, 0, sizeof(dst));

==> {0}花括号清零无疑更简洁,而且给编译器优化留了充分空间

  • API角度

{0}花括号清零:在编译器的指导下,基本上按照机器字的单位进行清零

在x86/64的环境下,编译为64位的程序,对于char example[13] = {0};,使用素数作为长度的连续内存,是按照 ** 8 + 4 + 1 ,使用汇编mov***指令进行清零
如果长度比较长的连续内存,除内存的边角料外,是按照 机器字 ,使用汇编rep stos指令进行清零

大家可自行验证

VS

memset清零:针对于字节单位进行清零

memset(&intvar, 1, sizeof(intvar))来证明memset按照字节为单位设置内存,非常警醒和形象!

大家可自行比较:

  • memset(dst, 1, sizeof(dst))
  • memset(dst, 257, sizeof(dst))
  • memset(dst, 4099, sizeof(dst))
    一些memset特殊值情况,内存值set情况

–> 以字节为单位的内存操作,猜测来看,应该没有以机器字为单位的操作快,但具体没有考证 

  • 汇编角度

{0}花括号清零:编译器根据目标内存大小,使用mov*指令或rep stos指令进行清零内存,从此可见编译器对花括号清零操作的不同优化

VS

memset清零:存在函数调用和memset内部已优化的内存set实现,但已不拥有目标内存的类型信息,猜测来看,优化空间没有编译器那么大,且无可避免地存在函数调用上损失

补充
  • 在C++下,由于存在虚函数表以及多继承等特殊语言特性,在内存布局上,能够进行memset清零或者花括号清零操作的场景不多,但如果存在一些足够简单的类似C语言结构体对象,应该是可以类比的
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号