std::memset 坑点的疑问

学术版

印象中我好像听别人说的是,性能不大好如果多次使用会被卡常来着。 不过有的时候偷懒还是会 memset。 还有为什么你会把这个东西理解为只能用于程序开始时的初始化 虽然我看不懂这段 cppref 的说明((
by RainPPR @ 2024-04-12 22:57:05


@[RainPPR](/user/371511) 就是这个“此函数不能用于擦洗内存”让我不明所以,所以问是不是只能用来初始化
by lzy20091001 @ 2024-04-12 22:59:27


@[lzy20091001](/user/932039) 多组数据 memset 的时候,你 memset 的对象又不是“在其生存期的剩余部分不再被访问”,所以根本不影响
by 小粉兔 @ 2024-04-12 23:01:24


其称的不能擦洗内存指的是比如 ``` { Password user_pass = /* ... */; // do something std::memset(user_pass, 0, sizeof user_pass); } ``` 这个时候编译器有权把 memset 忽略。导致可能的内存探测或者侧信道攻击。 这个代码的问题是 user_pass 是局部变量并且后面就不再访问了。OI 代码里根本没有这种情况——memset 的目的就是让下一轮的时候访问它
by 小粉兔 @ 2024-04-12 23:04:28


@[lzy20091001](/user/932039) 楼上正解
by cff_0102 @ 2024-04-12 23:09:27


[一个实例](https://godbolt.org/z/dKK8hxMTK)。
by ud2_ @ 2024-04-12 23:12:12


@[lzy20091001](/user/932039) 无可视副作用时才会被优化。对于OI根本不影响。不能重置密码是因为被优化掉之后可能会有人去内存里找密码。但对于我们来讲不会有问题。
by litjohn @ 2024-04-13 13:11:50


|