C++ “什么是”呢;“位填充”;或;“填充位”;确切地

C++ “什么是”呢;“位填充”;或;“填充位”;确切地,c++,c,memory,memory-management,padding,C++,C,Memory,Memory Management,Padding,我不想用这个来骚扰你,但我只是在互联网上找不到一个很好的解释来解释“比特填充”到底是什么,也找不到关于StackOverflow上比特填充相关线程的任何答案 我还搜索了ISO9899-1990,其中提到了“位填充”,但没有解释我需要它 我在网上找到的关于这一点的唯一内容是,其中只有一句话给出了可笑的简短解释,说: 位填充: 位填充是向传输或存储单元添加一个或多个额外位,使其符合标准大小 一些源将位填充标识为一种类型的填充 它至少提供了一些信息,但对我来说还不够解释。我不太明白那到底是什么意思。它

我不想用这个来骚扰你,但我只是在互联网上找不到一个很好的解释来解释“比特填充”到底是什么,也找不到关于StackOverflow上比特填充相关线程的任何答案

我还搜索了ISO9899-1990,其中提到了“位填充”,但没有解释我需要它

我在网上找到的关于这一点的唯一内容是,其中只有一句话给出了可笑的简短解释,说:

位填充: 位填充是向传输或存储单元添加一个或多个额外位,使其符合标准大小

一些源将位填充标识为一种类型的填充

它至少提供了一些信息,但对我来说还不够解释。我不太明白那到底是什么意思。它也指这个术语


当我在StockOverflow上查看“”的相对标记时,填充描述为:

插入内存结构以实现地址对齐的额外空间-或-框架和HTML元素内容之间的额外空间-或-使用格式化打印命令(如C中的printf*-函数族)打印值时的额外空间或零

背景: 我经常发现术语“位填充”与数据类型有关,但我不明白它是什么,也不清楚它对这些数据类型做了什么

非常感谢您提供任何基于主题的答案

位填充:
位填充是向传输或存储单元添加一个或多个额外位,使其符合标准大小

由于您发布的定义已经正确,我将尝试用一个例子来解释:

假设您必须存储占用少于32位的数据,但您有4个字节的插槽。通过访问每个插槽更容易访问数据,因此您只需完成所有32位。完成“给定空间”所需但不属于数据一部分的附加位符合位填充

我相信在多种情况下可能会有更好的例子。任何人,请随意编辑和/或用新的改进或示例完成答案

希望这有帮助

位填充:
位填充是向传输或存储单元添加一个或多个额外位,使其符合标准大小

由于您发布的定义已经正确,我将尝试用一个例子来解释:

假设您必须存储占用少于32位的数据,但您有4个字节的插槽。通过访问每个插槽更容易访问数据,因此您只需完成所有32位。完成“给定空间”所需但不属于数据一部分的附加位符合位填充

我相信在多种情况下可能会有更好的例子。任何人,请随意编辑和/或用新的改进或示例完成答案


希望这有帮助

因此,假设您有一个8位数字,它是一个
uint8\u t
,其值设置为
4
。这可能存储为
a=0000 0100
。现在,假设您希望将其转换为16位数字。会发生什么?您必须为此数字中的“新”位分配一些值。您将如何分配它们?您不能随机分配0或1,原始变量的值将发生变化。取决于架构等。您必须用额外的位填充值。在我的例子中,这意味着在原始MSB(最高有效位)前面额外添加八个零,使我们的数字
a=0000 0100


值仍然是4,但现在可以指定[0,2^16)范围内的任何内容,而不是[0,2^8)范围。

因此,假设您有一个8位数字,它是一个
uint8\u t
,其值设置为
4
。这可能会存储为
a=0000 0100
。现在,假设您希望将其转换为一个16位数字。会发生什么情况?您必须为该数字中的“新”位分配一些值。您将如何处理为它们赋值?不能随机分配0或1,原始变量的值将发生变化。取决于体系结构等。必须用额外的位填充值。在我的情况下,这意味着在原始MSB(最高有效位)前面额外添加8个零,使我们的号码
a=0000 0100


值仍然是4,但现在您可以分配[0,2^16)范围内的任何内容,而不是[0,2^8)范围内的任何内容。

位填充可以在多个上下文中使用。两个常见的示例是网络和加密。我相信加密上下文更相关

在加密中使用填充,以使具有公共部分的消息更难破译。如果已知多条消息具有相同的前缀(例如,“hello”),则更容易断开密钥。通过使用可变长度位字段“填充”消息,使断开密钥更难

据称,英国情报部门能够加快对“谜”信息的分析,因为德国人的信息以相同的标题开头


有关更技术、更准确的描述:请查看有关分组密码的部分,位填充可以在多个上下文中使用。两个常见的示例是网络和加密。我认为加密上下文更相关

在加密中使用填充,以使具有公共部分的消息更难破译。如果已知多条消息具有相同的前缀(例如,“hello”),则更容易断开密钥。通过使用可变长度位字段“填充”消息,使断开密钥更难

据说,英国情报部门能够加快对“谜”信息的分析,因为德国人在开始他们的信息时使用了同样的方法
struct foo
{
    short a; // 16 bits
    char  b; // 8 bits 
};
foo array[10]{};
struct foo
{
    short a; // 16 bits
    char  b; // 8 bits 
    char  _; // 8 bits of padding
};
struct bar
{
    char c; // 8 bits
    int  d; // 32 bits
};
struct bar
{
    char    c; // 8 bits
    char _[3]; // 24 bits
    int     d; // 32 bits
};