如何在不破坏 vtbl 的情况下执行 memset(this, ...) 的等效操作?

2023-12-25

我知道 memset 不受欢迎class初始化。例如,如下所示:

class X { public: 
X() { memset( this, 0, sizeof(*this) ) ; }
...
} ;

将会破坏vtbl如果有一个virtual混合中的功能。

我正在开发一个(巨大的)遗留代码库,它是 C 风格的,但用 C++ 编译,因此所有相关成员通常都是 POD,不需要传统的 C++ 构造函数。 C++ 的使用逐渐普及(如虚拟函数),这让那些没有意识到 memset 具有这些额外的 C++ 牙齿的开发人员感到苦恼。

我想知道是否有一种 C++ 安全方法来执行初始包罗万象的零初始化,然后可以进行特定的成员初始化,其中零初始化不合适?

我发现类似的问题C++ 中的 memset 初始化 https://stackoverflow.com/questions/2481654/memset-for-initialization-in-c, and 使用 memset 将派生结构清零 https://stackoverflow.com/questions/7082691/zeroing-derived-struct-using-memset。这两个都有“不要使用 memset()”答案,但没有好的替代方案(特别是对于可能包含许多成员的大型结构)。


对于您找到的每个班级memset调用,添加一个memset成员函数忽略指针和大小参数并对所有数据成员进行赋值。

edit:实际上,它不应该忽略指针,它应该将它与this。如果匹配,则为对象执行正确的操作;如果不匹配,则重新路由到全局函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不破坏 vtbl 的情况下执行 memset(this, ...) 的等效操作? 的相关文章

随机推荐