【发布时间】:2019-08-09 12:11:18
【问题描述】:
tl;dr;如何用基本的c++重现memset?
我试图弄清楚memset 是如何工作的,并看看我是否可以使用指针和地址在正常的c++ 中重现它。
这是我到目前为止所得到的。
void test_memset( void * origin, uint8_t val, size_t size ){
if( size != 1 ){
uint8_t* new_or = (uint8_t*) origin; // casting to uint8_t*
*new_or ^= (*new_or & 0xff); // clearing any remaining data
*new_or ^= val; // assigning the val
new_or++; // incrementing pointer
test_memset_alloc( new_or, val, size-1 ); // recursion
}
}
所以问题是:memset 在基本 c++ 中是什么样子的?
编辑 1:
以类似的方式回答here,而here 则稍微冗长一些。这两个答案都比我的提议更适合。
但我希望看到一些详细的解决方案,这将能够解释 Mort(业务线开发人员)或知识不完整的人,比:“这令人不悦”更清楚地解释正在发生的事情或“不是 C++ 方式”。
【问题讨论】:
-
因为递归限制?
-
@Danilo memset 在 C++ 代码中实现看起来很像 stackoverflow.com/a/18851921/126769 ,如果你引入了无意义的代码(在某些情况下它甚至是未定义的行为,因为你可以读取一个未初始化的值)比如
*new_or ^= (*new_or & 0xff);,您几乎可以保证混淆“用户”而不是教他们一些东西。