C ++中的内存模型:为什么将struct中的两个整数分配在同一内存位置?

时间:2019-03-21 04:48:42

标签: c++ memory bit-fields

请参阅下面粘贴的cppreference.com上的代码段,为什么将整数bc分配在同一存储位置:

struct S {
    char a;     // memory location #1
    int b : 5;  // memory location #2
    int c : 11, // memory location #2 (continued)
          : 0,
        d : 8;  // memory location #3
    struct {
        int ee : 8; // memory location #4
    } e;
} obj; // The object 'obj' consists of 4 separate memory locations

我的理解是,例如,在1字节= 8位的系统中,变量a将占用1个字节。然后b将占用4个字节。如果bc都位于同一个内存位置,该内存位置将填充8个字节,这是否意味着可以连续地在同一个内存位置中分配8个char变量? >

此外,如果它们具有相同的存储位置,程序将如何知道在何处访问bc

1 个答案:

答案 0 :(得分:6)

您错过了:5:11
确保您知道他们在做什么。这是创建位域的语法。 (感谢Nate提醒我这个词让我感到疲倦,并提供了有用的链接https://en.cppreference.com/w/cpp/language/bit_field) 基本上,他们说“只需要5位和11位,请随意将它们压缩为一个int”。
假设很有可能int在您的环境中至少为16位(以压缩两个)或至少为24位(以压缩第三个)。

当您说“相同的内存位置”时,这是正确的,它们位于相同的(可能)32位位置,但不完全位于同一内存中。它们是不同的位。因此,系统以某种方式(取决于硬件且未定义)访问它们,它们仅使用部分位。您可能会认为它是编译器/ CPU进行了一些移位和屏蔽,但只是作为发生情况的模型。