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

问题描述 投票:2回答:1

参考我在下面粘贴的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的位置?

c++ memory bit-fields
1个回答
6
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.