复制C++POD时控件对填充的影响

Control effects on padding when copying a C++ POD

本文关键字:填充 影响 控件 C++POD 复制      更新时间:2023-10-16

C++标准中未指定填充。它依赖于编译器和CPU。手动避免填充可能会导致性能问题或更糟。因此,控制填充中的内容似乎是一种更可行的方法,可以最大限度地减少填充引起的不良副作用,例如安全性。

我想做的是在一个对齐的POD中填充0。例如模板化函数template<typename T> T zero_padding(T const & pod);

但也存在一些问题。

  1. 如果我们直接复制struct,我们不知道在填充上会做什么,因为C标准不能保证任何东西
  2. 我们可以memset结构,然后进行成员复制。但它似乎是特定于结构的,对于模板来说不容易做到

所以我似乎找不到一个简单的方法来做这件事。

这似乎是他们争论的核心

由于未初始化,填充字节可能有随机数据(敏感数据)

我建议,在处理完敏感数据后,清除敏感数据要比所有其他代码担心内存中包含敏感数据安全得多。你希望敏感数据有一个可控的生命周期,让它闲置而不被控制是很脆弱的。

使用memcpy复制结构的字节。这将复制填充字节。memcpy的合法性是POD概念的整体主旨。

要确保复制操作生成零填充,请确保每个原始对象都使用零填充进行初始化。当执行值初始化时,C++确实将POD的填充位初始化为零,即,如果初始化器是= T()或在C++11中,则简单地为{}。如果您愿意,也可以使用memset